44

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

// main.cpp
int main() {}

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

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

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

g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a

或者

g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib

你有更好的想法吗?

4

4 回答 4

59

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

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

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

g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a

一般来说,它将是:

g++ -o program main.o \
    -Wl,--whole-archive -lmylib \
    -Wl,--no-whole-archive -llib1 -llib2
于 2013-01-02T03:20:58.113 回答
8

最初的建议是“关闭”:

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

于 2013-01-02T03:21:42.083 回答
6

我更喜欢其他答案,但这是另一个“解决方案”。

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

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

    g++ -o program main.o mylib/*.o
    
于 2013-01-02T05:38:36.253 回答
4

如果静态库中有一个特定函数被链接器剥离为未使用,但您确实需要它(一个常见示例是JNI_OnLoad()函数),您可以强制链接器保留它(当然,所有代码从此函数调用)。添加-u JNI_OnLoad到您的链接命令。

于 2017-05-10T13:44:10.753 回答