flatcc 未定义符号 aligned_free/aligned_malloc

flatcc undefined symbol aligned_free/aligned_malloc

已解决

我目前正在研究 LabWindows/CVI,这是一个 C。唯一支持的 C 版本是 c99。我正在尝试将 Google Flatbuffers(c 版本 flatcc)集成到我当前的项目中。当我尝试 link 我的解决方案时,我遇到了 linking 错误:

第一个问题:我该如何解决这个错误?

根据供应商的说法,LabWindows/CVI 使用 CLANG as compiler。如果我看一下符号 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 只接受 .lib 作为 lib(没有 .a)所以我不得不使用 Cmake 和 MSVS19 编译 flatcc。我已经尝试了几种配置但无能为力我总是得到同样的错误。

此致

EDIT:我通过执行此 cmake 命令修复了一个未定义的符号“__allmul”:

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.makeflatcc\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.txtflatcc\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 个错误仍然存​​在:

您能否尝试将 flatcc 编译为静态库并强制输出为 .lib 而不是(默认情况下).a(使用“-o flatcc.lib”标志)?我猜的问题是你在这里使用了两个不同的编译器(msvc 和 clang),在同一个平台(win32)上,默认情况下 clang 可能有一个“unix 做事方式”。 ;)

但实际上我认为这里的重点来自以下评论引用:

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.

也许只是尝试用 clang 和“-std=c89”标志编译 flatcc 以避免任何问题。 做:

cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=clang .

然后在生成的flatcc\src\compiler\CMakeFiles\flatcc.dir\flags.make文件中,可以将-std=c11改为-std=c89。 然后再次编译项目:

make

默认情况下,当我在 windows 上使用 mingw-32 编译 flatcc 时,我设置了 -std=c11 标志(gcc 7.3 版)

好吧,为了解决这个问题,我不得不在 32 位中使用 clang 编译 flatcc。为此,我进入了 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.makeflatcc\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.txtflatcc\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

感谢 Victor Gallet