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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何强制gcc链接未使用的静态库相关的知识,希望对你有一定的参考价值。

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

// main.cpp
int main() {}

// mylib.cpp
#include <iostream>
struct S {
    S() { std::cout << "Hello World
";}
};
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
另一答案

最初的建议是“接近”:

试试这个:-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添加到您的链接命令。

以上是关于如何强制gcc链接未使用的静态库的主要内容,如果未能解决你的问题,请参考以下文章

GCC强制静态库链接未使用的函数变量

强制链接到未使用的共享库

gcc系强制链接静态库(同时有.so和.a)

强制 GCC 通知共享库中未定义的引用

Linux gcc编译时强制链接并依赖一个库(即使未使用)

Android NDK编译如何强制使用libc++.a的静态链接库