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

How to force gcc to link an unused static library

本文关键字:未使用 一个 静态 gcc 何强制 链接      更新时间:2023-10-16

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

// main.cpp
int main() {}
// mylib.cpp
#include <iostream>
struct S {
    S() { std::cout << "Hello Worldn";}
};
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
你有更好的主意吗?

使用--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

最初的建议是"close":

  • 如何强制gcc从库中链接未引用的静态c++对象

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

我更喜欢其他答案,但这里有另一个"解决方案"。

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

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

    g++ -o program main.o mylib/*.o
    

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