如何强制gcc链接未使用的静态库

Mar*_*tin 34 c c++ gcc g++ ld

我有一个程序和一个静态库:

// main.cpp
int main() {}

// mylib.cpp
#include <iostream>
struct S {
    S() { std::cout << "Hello World\n";}
};
S s;
Run Code Online (Sandbox Code Playgroud)

我想将静态库(libmylib.a)链接到程序对象(main.o),虽然后者不直接使用前者的任何符号.

以下命令似乎不适合g++ 4.7.它们将在没有任何错误或警告的情况下运行,但显然libmylib.a不会链接:

g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a
Run Code Online (Sandbox Code Playgroud)

要么

g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib
Run Code Online (Sandbox Code Playgroud)

你有更好的想法吗?

Ale*_*x B 48

使用--whole-archive链接器选项.

在命令行之后的库将不会丢弃未引用的符号.您可以通过--no-whole-archive在这些库之后添加来恢复正常链接行为.

在您的示例中,命令将是:

g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a
Run Code Online (Sandbox Code Playgroud)

一般来说,它将是:

g++ -o program main.o \
    -Wl,--whole-archive -lmylib \
    -Wl,--no-whole-archive -llib1 -llib2
Run Code Online (Sandbox Code Playgroud)

  • 无论如何,用户应该在最后添加`-Wl,-no-whole-archive`.正如[man ld](http://man7.org/linux/man-pages/man1/ld.1.html)所说:*"其次,不要忘记使用`-Wl,-no-whole-archive `在您的档案列表之后,因为gcc会将自己的档案列表添加到您的链接中,您可能也不希望此标志也影响这些档案."* (4认同)

pau*_*sm4 7

最初的建议是"接近":

试试这个: -Wl,--whole-archive -lyourlib


bri*_*ing 6

我更喜欢其他答案,但这是另一个"解决方案".

  1. 使用ar命令从存档中提取所有.o文件.

    cd mylib ; ar x /path/to/libmylib.a
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后将所有这些.o文件添加到链接器命令

    g++ -o program main.o mylib/*.o
    
    Run Code Online (Sandbox Code Playgroud)