【发布时间】:2016-04-20 20:57:51
【问题描述】:
我正在创建一个二进制文件并链接依赖项。
所有二进制文件都将链接到libpthread.so
发布模式二进制文件将链接到 libtcmalloc.a
我发现库的顺序很重要。
如果我按如下方式指定对target_link_libraries 的调用,则二进制文件无法链接。
target_link_libraries(
${NAME}
${LIBS} pthread
optimized
tcmalloc_minimal.a)
错误:
[ 59%] Linking CXX executable app .../libtcmalloc_minimal.a(libtcmalloc_minimal_internal_la-static_vars.o): In function `SetupAtForkLocksHandler': /tmp/gperftools-2.4/src/static_vars.cc:119: undefined reference to `pthread_atfork' collect2: error: ld returned 1 exit status
但是,如果我更改库的顺序以使pthread 出现在 tcmalloc 之后,则链接可以正常工作:
target_link_libraries(
${NAME}
${LIBS}
optimized
tcmalloc_minimal.a
general
pthread)
问题:
- 有没有办法让 cmake 计算出依赖关系并自动创建正确的链接顺序?
- gcc 有
-Wl,--start-group/-Wl,--end-group可以解决这个问题。有没有办法让 cmake 使用这个功能?
【问题讨论】:
-
无法提供太多具体建议,但您的观察结果是可以的:排序通常很重要,因为 TU/库是从左到右评估的,记录未定义的参考,并搜索后续单元未定义的引用。所以,家属应该放在第一位(最左边),然后是他们所依赖的东西。