Решено
В настоящее время я работаю над 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