(GCC) gcc编译选项 -Wl, -start-group,whole-archive,-Wl, Bstatic
1. start-group 编译选项
假设程序x依赖三个静态库:libX1.a、libX2.a和libX3.a,而libX2.a又依赖libX1.a,libX3.a依赖libX2.a和libX1.a,正常情况下的CMakeLists.txt格式如下
target_link_libraries(
x
libX1.a
libX2.a
libX3.a
)
但也可以偷懒,不关心静态库的顺序问题,ld为此提供了start-group和end-group两个选项,让包含在这两者间的静态库顺序可以随意。
target_link_libraries(
x
-Wl,--start-group
libX3.a
libX2.a
libX1.a
-Wl,--end-group
)
2. Bstatic编译选项
用 "-Wl,-Bstatic" 指定链接静态库,使用 "-Wl,-Bdynamic" 指定链接共享库,使用示例:
-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest
3. whole-archive编译选项
默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。
这个时候,可以启用链接参数 "--whole-archive" 来告诉链接器,将后面库中所有符号都链接进来,参数 "-no-whole-archive" 则是重置,以避免后面库的所有符号被链接进来。