(GCC) gcc编译选项 -Wl, -start-group,whole-archive,-Wl, Bstatic

发布时间 2023-07-19 15:46:08作者: DoubleLi

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
CMAKE 复制 全屏

3. whole-archive编译选项

默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。
这个时候,可以启用链接参数 "--whole-archive" 来告诉链接器,将后面库中所有符号都链接进来,参数 "-no-whole-archive" 则是重置,以避免后面库的所有符号被链接进来。