如何强制gcc链接一个未使用的静态库
How to force gcc to link an unused static library
我有一个程序和一个静态库:
// 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
我更喜欢其他答案,但这里有另一个"解决方案"。
-
使用ar命令从存档中提取所有.o文件。
cd mylib ; ar x /path/to/libmylib.a
-
然后将所有。o文件添加到链接器命令
g++ -o program main.o mylib/*.o
如果静态库中有一个特定的函数被链接器剥离为未使用,但您确实需要它(一个常见的例子是JNI_OnLoad()函数),您可以强制链接器保留它(当然,所有从该函数调用的代码)。将-u JNI_OnLoad
添加到链接命令
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 普通环路未使用gcc 4.8.5自动矢量化
- 在更改for循环的第三部分后,未使用for循环结果
- 使用typeid警告未使用的变量
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++删除未使用的类属性会导致 std::logic_error
- 警告 C4552:">>":未使用表达式的结果
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 使用一个循环与两个循环
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 如何强制MSVC链接一个未使用的静态库(相当于GC——整个归档参数)
- 为什么模板类会有一个未使用的类型
- 声明一个(未使用的)整数,导致整个程序出现故障
- 如果一个未使用的函数参数是指向函数的指针,则是其实际参数所需的定义
- C++宏在子类未使用另一个宏时失败
- 如何让gcc报告一个未定义的、未使用的外部符号的错误
- 使用一个由c++修改的未关闭的文本文件安全吗
- 创建一个元组样式的类来优化未使用的部分
- 如何强制gcc链接一个未使用的静态库