我有一个程序和一个静态库:
// 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
你有更好的想法吗?
答案 0 :(得分:47)
使用--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
答案 1 :(得分:7)
最初的建议是“接近”:
试试这个:-Wl,--whole-archive -lyourlib
答案 2 :(得分:6)
我更喜欢其他答案,但这是另一个“解决方案”。
使用ar命令从存档中提取所有.o文件。
cd mylib ; ar x /path/to/libmylib.a
然后将所有这些.o文件添加到链接器命令
g++ -o program main.o mylib/*.o
答案 3 :(得分:4)
如果静态库中有一个特定的函数被链接器剥离为未使用,但你确实需要它(一个常见的例子是 JNI_OnLoad()函数),你可以强制链接器保持它(当然,从这个函数调用的所有代码)。将-u JNI_OnLoad
添加到链接命令。