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

Решено

В настоящее время я работаю над LabWindows/CVI, это C. Единственная поддерживаемая версия C - c99. Я пытаюсь интегрировать Google Flatbuffers (версия c flatcc) в свой текущий проект. Когда я пытаюсь связать свое решение, я сталкиваюсь с ошибкой связывания: Ошибка связывания

Первый вопрос: как исправить эту ошибку?

Согласно поставщику, LabWindows/CVI используют CLANG в качестве компилятора. если я взгляну на файл, где появляется символalign_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.
 */

Второй вопрос: Согласно приведенному выше тексту, у меня должно быть определение выровненного_свободного/выровненного_маллока, но по какой-то причине у меня его нет. Почему ? Что мне не хватает?

Дополнительная информация: LabWindows/CVI принимает только .lib как lib (без .a), поэтому мне пришлось компилировать flatcc с помощью Cmake и MSVS19. Я пробовал несколько конфигураций, но ничего не поделаешь, я всегда получаю одну и ту же ошибку.

С наилучшими пожеланиями

EDIT: я исправил один неопределенный символ '__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 .

Затем редактируем flatcc\src\compiler\CMakeFiles\flatcc.dir\flags.make и flatcc\src\runtime\CMakeFiles\flatcc.dir\flags.make

чтобы выглядело так: 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 содержит какое-то встроенное ключевое слово)

Затем отредактируйте flatcc\src\compiler\CMakeFiles\flatcc.dir\link.txt и flatcc\src\runtime\CMakeFiles\flatcc.dir\link.txt, чтобы они выглядели так:

...\bin\clang\bin\ar.exe rc ..\..\..\lib\flatcc.lib  CMakeFiles/flatcc.dir/__/__/external/hash/cmetrohash64.c.obj ...
...bin\clang\bin\ranlib.exe ..\..\..\lib\flatcc.lib

Затем запустив Mingw32-make.exe

Осталось 2 ошибки: Осталась ошибка


person Xemuth    schedule 28.12.2020    source источник


Ответы (2)


Не могли бы вы попытаться скомпилировать 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 .

Затем в сгенерированном файле flatcc\src\compiler\CMakeFiles\flatcc.dir\flags.make можно изменить -std=c11 на -std=c89. Затем снова скомпилируйте проект с помощью:

make

По умолчанию, когда я компилирую flatcc с mingw-32 в Windows, у меня установлен флаг -std=c11 (версия gcc 7.3).

person Victor Gallet    schedule 29.12.2020
comment
Здравствуйте, спасибо за ваш ответ. Я попробую, я скоро вернусь. - person Xemuth; 29.12.2020
comment
Дайте мне знать ;) Мне удалось скомпилировать flatcc с помощью msvc и связать его с mingw32 в Windows, поэтому я думаю, что нет причин, по которым вы не могли бы использовать его с clang. - person Victor Gallet; 29.12.2020
comment
Моя команда 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? В каком файле я могу это изменить? - person Xemuth; 29.12.2020
comment
Что ж, чтобы приобрести .lib, я просто изменил links.txt: ...bin\clang\bin\ar.exe rc ..\..\..\lib\flatcc.lib ... - person Xemuth; 29.12.2020
comment
На самом деле, поскольку вы использовали clang в Windows, даже если файл имеет расширение .a, он все еще является допустимой статической библиотекой Windows. Поэтому, если вам нужен .lib, вы можете просто переименовать его. да, изменение файла links.txt, созданного командой cmake, в любом случае даст вам файл .lib :) - person Victor Gallet; 29.12.2020
comment
Итак, теперь, если вы скомпилируете свою программу и свяжете ее с этим flatcc.lib, а также включите заголовки (в include/flatcc/) для получения объявлений, вы сможете ее использовать. - person Victor Gallet; 29.12.2020
comment
Виктор Галле, готово, я отредактировал первый пост. Компиляция с помощью clang исправила одну из 3 ошибок. Лучше, чем ничего - person Xemuth; 29.12.2020

Что ж, чтобы решить эту проблему, мне пришлось скомпилировать 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 .

Затем отредактировал flatcc\src\compiler\CMakeFiles\flatcc.dir\flags.make и flatcc\src\runtime\CMakeFiles\flatcc.dir\flags.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

Затем изменил flatcc\src\compiler\CMakeFiles\flatcc.dir\link.txt и flatcc\src\runtime\CMakeFiles\flatcc.dir\link.txt, чтобы они выглядели так:

...\bin\clang\bin\ar.exe rc ..\..\..\lib\flatcc.lib  CMakeFiles/flatcc.dir/__/__/external/hash/cmetrohash64.c.obj ...
...bin\clang\bin\ranlib.exe ..\..\..\lib\flatcc.lib

Примечание. Я только что изменил имя сгенерированного файла .a на .lib

Затем, наконец, я запускаю mingw32-make.exe (или make.exe)

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

person Xemuth    schedule 29.12.2020