gpt4 book ai didi

c++ - 与 cmake 链接错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:00 27 4
gpt4 key购买 nike

我想了解为什么在编译使用 CMake 生成的项目时出现链接错误。

CMakeFiles.txt 为项目的每个文件夹构建一个静态库,然后通过以下方式将它们全部链接在一起:

# root CMakeLists.txt

add_subdirectory(subfolder1)
add_subdirectory(subfolder2)
add_subdirectory(...)

add_executable(target ${SOURCES})

set(LIBRARIES
LIB_FOO
LIB_BAR
...
)

target_link_libraries(target
${LIBRARIES}
)

然后在每个子文件夹中我有一个简单的 CMakeLists.txt 就像

file(GLOB FOO_SOURCE *.cpp)
add_library(LIB_FOO ${FOO_SOURCE})

现在这可以正常工作并编译一切正常,但我在链接时得到了一个 undefined reference ,所以我试图调查最后是否一切都可用,看起来是这样。实际错误如下:

libLIB_WORLD.a(World.cpp.o): In function `World::generate(WorldGenOptions)':
World.cpp:(.text+0x803): undefined reference to `MapGenerator::MapGenerator(BlockMap*)'
World.cpp:(.text+0x837): undefined reference to `MapGenerator::generate(bool, WorldGenOptions)'

现在,MapGenerator.cpp 是 LIB_MAP 的一部分,因此我检查了该文件是否存在并包含以下符号:

:~$ nm libLIB_MAP.a | grep generate
....
00000000000044dc T _ZN12MapGenerator8generateEb15WorldGenOptions

:~$ nm CMakeFiles/LIB_MAP.dir/MapGenerator.cpp.o | grep generate
....
00000000000044dc T _ZN12MapGenerator8generateEb15WorldGenOptions

所以符号存在,此时我检查它是否被 ld 正确链接:

:~$ make VERBOSE=1
/usr/bin/g++ ... libLIB_MAP.a libLIB_WORLD.a ...

因此它实际上与无法找到该符号的其他库一起出现在链接阶段。

我是否缺少一些微不足道的东西?我对 CMake 很陌生,所以我没有想法。

最佳答案

这是在 CMake 中未正确建模的库依赖项的问题。

您的LIB_WORLD 引用了LIB_MAP 中的方法。此依赖项未在您的 CMake 脚本中建模。由于这两个都是静态库,因此它们仍然可以自行构建。 (请记住,静态库本质上是一堆打包在一起的目标文件,但它们从不通过链接器。)

但是,一旦将它们链接到可执行文件或共享库,就会遇到问题。即使您的可执行文件同时链接到 LIB_WORLDLIB_MAP,它以错误的顺序链接。因此,当链接器尝试为 LIB_WORLD 解析丢失的符号时,它还不知道 LIB_MAP 导出的符号,因此会出现您遇到的错误消息。

正确的解决方法是引入对 LIB_WORLD 的依赖:

add_library(LIB_WORLD [...])
target_link_libraries(LIB_WORLD LIB_MAP)

现在,每当您将某些内容链接到 LIB_WORLD 时,您也将始终链接到 LIB_MAPCMake 会确保顺序正确。 (特别是,如果您的可执行文件不直接使用 LIB_MAP 中的方法,您可能希望将其从 target_link_libraries 中完全删除。)

作为一个额外的好处,它现在允许您将 LIB_WORLD 构建为共享库,这在以前会因链接器错误而失败。

关于c++ - 与 cmake 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600907/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com