我试图理解为什么在编译使用 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})
现在,这可以正常工作并编译所有内容,但在链接时我得到了未定义的引用,因此我尝试调查最后所有内容是否可用,看起来像这样。实际错误如下:
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 很陌生,所以我没有想法。