#c #clang #flatbuffers #cvi #labwindows
#c #лязг #плоские буферы #cvi #labwindows
Вопрос:
Решаемая
В настоящее время я работаю над LabWindows / CVI, это C. Единственной поддерживаемой версией C является c99. Я пытаюсь интегрировать Google Flatbuffers (версию flatcc на c) в мой текущий проект. Когда я пытаюсь связать свое решение, я сталкиваюсь с ошибкой связывания :
Первый вопрос: как я могу исправить эту ошибку?
По словам поставщика, LabWindows / CVI использует CLANG в качестве компилятора. если я посмотрю на файл, в котором появляется символ aligned_free / algined_malloc, я смогу прочитать это :
/*
* NOTE: MSVC in general has no aligned alloc function that is
* compatible with free and it is not trivial to implement a version
* which is. Therefore, to remain portable, end user code needs to
* use `aligned_free` which is not part of C11 but defined in this header.
*
* glibc only provides aligned_alloc when _ISOC11_SOURCE is defined, but
* MingW does not support aligned_alloc despite of this, it uses the
* the _aligned_malloc as MSVC.
*
* The same issue is present on some Unix systems not providing
* posix_memalign.
*
* Note that clang and gcc with -std=c11 or -std=c99 will not define
* _POSIX_C_SOURCE and thus posix_memalign cannot be detected but
* aligned_alloc is not necessarily available either. We assume
* that clang always has posix_memalign although it is not strictly
* correct. For gcc, use -std=gnu99 or -std=gnu11 or don't use -std in
* order to enable posix_memalign, or live with the fallback until using
* a system where glibc has a version that supports aligned_alloc.
*
* For C11 compliant compilers and compilers with posix_memalign,
* it is valid to use free instead of aligned_free with the above
* caveats.
*/
Второй вопрос: Согласно приведенному выше тексту, у меня должно быть определение aligned_free/ aligned_malloc , но по какой-то причине у меня его нет. Почему ? Чего мне не хватает?
Дополнительная информация: принимаются только LabWindows / CVI .библиотека как библиотека (№ a), поэтому мне пришлось скомпилировать flatcc с использованием Cmake и MSVS19. Я попробовал несколько конфигураций, но ничего не поделаешь, я всегда получаю одну и ту же ошибку.
Наилучшие пожелания
РЕДАКТИРОВАТЬ : я исправил один неопределенный символ ‘__allmul’, выполнив эту команду cmake :
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=x86_64-w64-mingw32-c99 -DFLATCC_PORTABLE=true -DFLATCC_ALLOW_WERROR=false -DBUILD_TESTING=false -DFLATCC_CXX_TEST=false -DFLATCC_REFLECTION=false -B .
Затем редактирование flatccsrccompilerCMakeFilesflatcc.dirflags.make
и flatccsrcruntimeCMakeFilesflatcc.dirflags.make
to выглядит так: C_FLAGS = -m32 -DFLATCC_REFLECTION=0 -Wstrict-prototypes -Wsign-conversion -Wconversion -std=c99 -pedantic -Wall -Wextra -DFLATCC_PORTABLE
-m32 для 32-разрядного двоичного файла и -std= c99 вместо -std=c11 (не могу поставить c89, потому что flatcc содержит какое-то встроенное ключевое слово)
Затем редактирование flatccsrccompilerCMakeFilesflatcc.dirlink.txt
и flatccsrcruntimeCMakeFilesflatcc.dirlink.txt
выглядит так :
...binclangbinar.exe rc ......libflatcc.lib CMakeFiles/flatcc.dir/__/__/external/hash/cmetrohash64.c.obj ...
...binclangbinranlib.exe ......libflatcc.lib
Затем выполняется Mingw32-make.exe
Ответ №1:
Не могли бы вы попробовать скомпилировать flatcc как статическую библиотеку и принудительно вывести ее как .lib вместо (по умолчанию) .a (с флагом «-o flatcc.lib»)? Проблема, я полагаю, в том, что здесь вы используете два разных компилятора (msvc и clang) на одной и той же плате (win32), а clang по умолчанию может иметь «unix-способ ведения дел». 😉
Но на самом деле важный момент здесь, я думаю, из этого комментария цитата:
Обратите внимание, что clang и gcc с -std=c11 или -std=c99 не будут определять * _POSIX_C_SOURCE и, следовательно, posix_memalign не может быть обнаружен, но * aligned_alloc также не обязательно доступен. Мы предполагаем *, что clang всегда имеет posix_memalign, хотя это не совсем * правильно.
Возможно, просто попробуйте скомпилировать flatcc с clang и с флагом «-std = c89», чтобы избежать каких-либо проблем. Сделать:
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=clang .
Затем в сгенерированном файле flatccsrccompilerCMakeFilesflatcc.dirflags.make вы можете изменить -std=c11 на -std=c89.
Затем снова скомпилируйте проект с помощью:
make
По умолчанию, когда я компилирую flatcc с помощью mingw-32 в Windows, у меня установлен флаг -std=c11 (версия gcc 7.3)
Комментарии:
1. Здравствуйте, спасибо за ваш ответ. Я попробую, я скоро вернусь.
2. Дайте мне знать 😉 Мне удалось скомпилировать flatcc с msvc и связать его с mingw32 в Windows, поэтому, я думаю, нет причин, по которым вы не могли бы использовать его с clang
3. Моя команда cmake такова:
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=clang -DFLATCC_PORTABLE=true -DFLATCC_ALLOW_WERROR=false -DBUILD_TESTING=false -DFLATCC_CXX_TEST=false -DFLATCC_REFLECTION=false -B .
я изменил -std=c11 на -std= c99 во flags.make, затем я запускаю Mingw32-make.exe на сгенерированном cmake. Он хорошо компилируется, но мой файл все еще .a, где я должен использовать"-o flatcc.lib
? В каком файле я могу это изменить?4. Хорошо, чтобы получить a . библиотека, которую я только что изменил links.txt :
...binclangbinar.exe rc ......libflatcc.lib ...
5. На самом деле, потому что вы использовали clang в Windows, даже если файл .a, он по-прежнему является допустимой статической библиотекой Windows. Так что, если вы хотите .lib, вы можете просто переименовать его. да, изменение links.txt файл , который был сгенерирован командой cmake , даст вам . файл библиотеки в любом случае 🙂
Ответ №2:
Ну, чтобы исправить эту проблему, мне пришлось скомпилировать flatcc с использованием clang в 32-битном. Для этого я перешел в каталог flatcc и сделал :
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=x86_64-w64-mingw32-c99 -DFLATCC_PORTABLE=true -DFLATCC_ALLOW_WERROR=false -DBUILD_TESTING=false -DFLATCC_CXX_TEST=false -DFLATCC_REFLECTION=false -DFLATCC_USE_GENERIC_ALIGNED_ALLOC -B .
Затем отредактировал flatccsrccompilerCMakeFilesflatcc.dirflags.make
и flatccsrcruntimeCMakeFilesflatcc.dirflags.make
добавил -m32 в C_FLAGS :
C_FLAGS = -m32 -DFLATCC_REFLECTION=0 -Wstrict-prototypes -Wsign-conversion -Wconversion -std=c11 -pedantic -Wall -Wextra -DFLATCC_PORTABLE -DFLATCC_USE_GENERIC_ALIGNED_ALLOC
Затем изменен flatccsrccompilerCMakeFilesflatcc.dirlink.txt
и flatccsrcruntimeCMakeFilesflatcc.dirlink.txt
выглядит так :
...binclangbinar.exe rc ......libflatcc.lib CMakeFiles/flatcc.dir/__/__/external/hash/cmetrohash64.c.obj ...
...binclangbinranlib.exe ......libflatcc.lib
Примечание: я только что изменил имя сгенерированного файла .a на .lib
Затем, наконец, я запускаю mingw32-make.exe
(или make.exe
)
Спасибо Виктору Галле