flatcc неопределенный символ aligned_free/aligned_malloc

#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

остаются 2 ошибки : Оставшаяся ошибка

Ответ №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 )

Спасибо Виктору Галле