原文链接:https://blog.csdn.net/lifemap/article/details/7586363

cmake中链接库的顺序是a依赖b,那么b放在a的后面。

例如进程test依赖a库,b库, a库又依赖b 库,那么顺序如下:
TARGET_LINK_LIBRARIES(test a b)

原文链接:https://www.cnblogs.com/aquester/p/10084070.html

前言

C/C++程序的许多同学被静态库的依赖折腾,因为默认情况下要求被依赖的库放在依赖它的库后面,当一个程序或共享库依赖的静态库较多时,可能会陷入解决链接问题的坑中。如果对静态库不熟悉,需要结构nm等工具来解决顺序问题。

但也可以偷懒,不关心静态库的顺序问题,ld为此提供了start-group和end-group两个选项,让包含在这两者间的静态库顺序可以随意。

方法

以CMake为例,假设程序x依赖三个静态库:libX1.a、libX2.a和libX3.a,而libX2.a又依赖libX1.a,libX3.a依赖libX2.a和libX1.a,正常情况下的CMakeLists.txt格式如下:

add_executable(xx.cpp
)
target_link_libraries(xlibX1.alibX2.alibX3.a
)

上面的写法libX1.a、libX2.a和libX3.a的顺序不能变,只能按上面的先后顺序。如果去掉顺序的烦恼和痛苦,可以采用如下的写法:

target_link_libraries(x-Wl,--start-grouplibX1.alibX3.alibX2.a-Wl,--end-group
)

target_link_libraries(x-Wl,--start-grouplibX3.alibX2.alibX1.a-Wl,--end-group
)

都可以,完全不用关心顺序。

附3:gcc链接参数–whole-archive的作用
默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。

这个时候,可以启用链接参数“--whole-archive”来告诉链接器,将后面库中所有符号都链接进来,参数“-no-whole-archive”则是重置,以避免后面库的所有符号被链接进来。

附4:如何让有些“-l”链接静态库,而另一些链接共享库?
用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:

-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest

"-Wl"表示是传递给链接器ld的参数,而不是编译器gcc/g++的参数。

CMake中链接库的顺序问题相关推荐

  1. 为什么链接库的顺序有时会导致GCC错误?

    为什么链接库的顺序有时会导致GCC错误? #1楼 一个让我震惊的提示:如果您以" gcc"或" g ++"的形式调用链接器,则使用" --start- ...

  2. cmake中boost库找不到问题

    有时候需要用到boost库,在CMAKE中怎么配置都很清楚,但是其中有一个小坑需要注意. 这个坑有点低级,但是有时候人们就是不知道没电是因为插排没插到插座上. boost库可能我们编译的时候选择了64 ...

  3. cmake中链接系统标准库

    貌似网上下的的linux工程都是用CMake来组织的,都有CMakeList.txt,感觉有必要学习一下. 先解决现在问题吧,有一个工程的src用Clion导入,会自动的生成CMakeList,但里面 ...

  4. cmake(二十七)Cmake中target再理解

    cmake翻译手册详解 cmake FAQ问题 一    目录结构 ++++++++++++++目录结构-->'最佳实践'++++++++++++++1)对于一个优秀的程序员而言,不仅仅是'编写 ...

  5. python连不上树莓派_树莓派respberry中cmake编译链接python2.7库不成功,求教

    本人在树莓派pi3平台上,下载respberry 5.4 lite 编译一个github上的项目,该项目用cmake管理,目前看到 链接库阶段不成功. 请教如何调整cmake的链接库目录,或是怎样直接 ...

  6. VS远程开发(远程调试)编译报错:对‘xxx’未定义的引用(设置库依赖顺序)(已解决)pthread(项目-->属性-->链接器-->输入-->库依赖项)

    如图在VS中对linux进行远程开发时,编译报错: 貌似是因为在代码中使用了pthread.h的函数,链接库依赖顺序出了问题,我在ubuntu里手动使用gcc main.c -lpthread -o ...

  7. [原]从一个链接错误探究GCC的链接库顺序

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用CodeBlocks10.05编一个小程序用到了png库和zlib库.我发现编译png静态库时,只需要指定zlib ...

  8. Linux下链接库出现的undefined reference问题总结

    1.链接时缺失了相关目标文件(.o) 测试代码如下: 然后编译. 01. gcc -c test.c 02. gcc -c main.c 得到两个.o文件,一个是 main.o,一个是test.o,然 ...

  9. linux 链接库文件出现“undefined reference to 问题的解决方法

    最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...

  10. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

最新文章

  1. android标题栏(titlebar)显示进度条
  2. 19元素的显示与隐藏
  3. SAP MM 分期付款场景下的付款方式
  4. day29Struts 类型转换和自定义类型转换,input视图
  5. sellhis股票平面图
  6. 3.PL_SQL——创建第一个匿名块(set,l,DBMS_OUTPUT.PUT_LINE())
  7. 前端学习(3250):一个简单的文件
  8. HSF服务注册失败,项目启动后,EDAS列表无法发现注册的服务
  9. cout输出字符串_leetcode C++题解系列-042 字符串相乘
  10. Js中对id和class属性进行模糊查询
  11. 【转】动态模型及其求解介绍–番外篇
  12. Qt学习之路(37): Qt容器类之关联存储容器
  13. oracle查询保留小数点后三位,关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)...
  14. 密码货币量化基金突然很热,但你可知道成功有多难?
  15. Compile LLVM+CLANG 4.0.1 for RHEL6
  16. 怎么将两个css合并单元格,css table之合并单元格
  17. linux怎样安装xz工具,linux xz解压工具
  18. actions vuex 请求_vue中在vuex的actions中请求数据实例
  19. Python里面的编码问题真的让人快疯了.. Python乱码 b'\x1f\x8b\x08\x00\x00\x00\x00\x00\...'
  20. C#将ip地址转换成长整形数字的代码

热门文章

  1. Stata:快速转换工作路径
  2. mtcnn人脸检测中将ckpt训练模型转换为 npy保存
  3. Chrome 的小恐龙游戏,被我破解了
  4. 【flv解析】Audio Specific Config 协议及解析
  5. 注册免费许可证试用 PowerApps
  6. 守望先锋为何如此火爆
  7. java如何将字符串转化为日期_java如何将字符串转为日期
  8. Word公式自动编号
  9. 综合使用公网/专网等频段!今日,工信部发布工业互联网和物联网无线电频率使用指南(附下载)...
  10. Win11设置人离开后电脑自动锁屏教程