相关疑难解决方法(0)

将错误与cmake链接

我试图理解为什么在编译用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}
)
Run Code Online (Sandbox Code Playgroud)

然后在每个子文件夹中我都有一个简单的CMakeLists.txt之类的

file(GLOB FOO_SOURCE *.cpp)
add_library(LIB_FOO ${FOO_SOURCE})
Run Code Online (Sandbox Code Playgroud)

现在这个工作并编译好一切但我在链接时得到一个未定义的引用,所以我试着调查一下最后是否所有内容都可用,它看起来就是这样.实际错误如下:

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)'
Run Code Online (Sandbox Code Playgroud)

现在,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
Run Code Online (Sandbox Code Playgroud)

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

:~$ make VERBOSE=1
/usr/bin/g++  ... libLIB_MAP.a libLIB_WORLD.a ...
Run Code Online (Sandbox Code Playgroud)

所以它实际上存在于链接阶段和其他无法找到符号的库中.

有什么小事我不见了吗?我对CMake很新,所以我没有想法.

c++ linker cmake static-libraries

4
推荐指数
1
解决办法
6915
查看次数

在动态库中包含静态库

我有以下问题:

  • 几个目标文件a1.o,a2.o,a3.o,...
  • 存档libxxxx.a.存档libxxxx.a只包含目标文件:b1.o,b2.o等...

我想从所有目标文件创建一个共享库(.so).

问题:如果我使用:

g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so
Run Code Online (Sandbox Code Playgroud)

g ++确实理解我想要链接静态库libxxxx.a并且不包括存档的所有符号.

一个简单的解决方法是首先使用ar -x然后创建lib 来扩展存档,但它并不是真正的"优雅".

必须有一个简单的命令强制g ++将整个存档包含在.so中,但我找不到它.

谢谢你的帮助.

g++ object shared-libraries archive

3
推荐指数
1
解决办法
2324
查看次数

标签 统计

archive ×1

c++ ×1

cmake ×1

g++ ×1

linker ×1

object ×1

shared-libraries ×1

static-libraries ×1