原文链接: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(
x
x.cpp
)
target_link_libraries(
x
libX1.a
libX2.a
libX3.a
)
上面的写法libX1.a、libX2.a和libX3.a的顺序不能变,只能按上面的先后顺序。如果去掉顺序的烦恼和痛苦,可以采用如下的写法:
target_link_libraries(
x
-Wl,--start-group
libX1.a
libX3.a
libX2.a
-Wl,--end-group
)
或
target_link_libraries(
x
-Wl,--start-group
libX3.a
libX2.a
libX1.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++的参数。