gpt4 book ai didi

c++ - cmake:共享库和静态库的排序重要吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:57:47 24 4
gpt4 key购买 nike

我正在创建一个二进制文件并链接到依赖项中。

所有二进制文件都将链接到 libpthread.so
Release模式二进制文件将链接到 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 使用此功能?

最佳答案

你也可以在cmake中指定起始组和结束组:

target_link_libraries(${NAME} -Wl, --start-group 
${LIBS} optimized tcmalloc_minimal.a general pthread
-Wl, --end-group)

注意:尽管这是一项昂贵的操作,因此理想情况下您应该弄清楚循环依赖关系并正确排序它们。如果这并非总是可行,请在链接库的最小可能子集上使用开始和结束组。

关于c++ - cmake:共享库和静态库的排序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755057/

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