如何链接未被使用的符号
最佳答案 问答题库888位专家为你答疑解惑
如何链接未被使用的符号
我们知道,在ld链接静态库过程中,通常只有被使用到的符号才回被链接进可执行文件中。
而在某些场景中,我们希望在链接的时候也能把未使用的符号也给链接进来。
在ext/mylib.h文件中声明了一个add函数和一个Register对象
#pragma once#include<iostream>int add(int a, int b);class Register {
public:Register() {std::cout<<"Register constructor : "<<this<<std::endl;// register}~Register() {}
};
在ext/mylib.cc文件中定义了add函数和一个Register静态实例
#include"mylib.h"int add(int a, int b) {return a + b;
}static Register r;
将上述文件编译成静态链接库mylib.a
在hello.cc中我们引入了mylib.h头文件,现在的问题是Register的构造函数会被调用吗?
#include"ext/mylib.h"int main() {return 0;
}
第一种情况,我们虽然引入mylib.h文件,但是没有调用任何mylib中的符号。执行的结果是:
什么也没有输出,Register没有被调用,说明Register符号并没有被链接进来。
第二种情况,我们引入mylib.h文件,并且调用add函数:
#include"ext/mylib.h"int main() {add(5,23);return 0;
}
编译运行,结果是:
Register constructor : 0x7ff8e85890e1
Register的构造函数被调用了,说明Register符号被链接进来了。
于是可以得出第一个结论,静态链接以.o文件为单位的。也就是说,在一个.o文件中,只要其中一个符号被链接进来,剩下的符号也会被链接进来(哪怕是没有被使用的)。
–whole-archive参数
如果我们没有引用链接库中的符号,但又想将这些符号链接进来怎么办?
可以使用ld链接器的一个参数:–whole-archive。具体在CMakeList中可以这么写:
target_link_libraries(my_exe -Wl,--whole-archive mylib -Wl,--no-whole-archive)
这里面需要注意的–whole-archive后面是想要全量链接的库名,之后要使用–no-whole-archive避免后面的库也全量链接。
还有一个问题,如果只想链接一个.o文件中被使用的符号,而把其它未被使用的符号删去,应该怎么做?
可以使用-ffunction-sections -fdata-sections参数生成.o文件,链接的时候再加上-Wl,–gc-sections参数。
上述实验仅针对静态链接,动态链接待研究。
99%的人还看了
相似问题
- 使用WalletConnect Web3Modal v3 链接钱包基础教程
- MongoDB——golang操作(链接,CURD,聚合)
- HTML 超链接 a 标签
- WSL2安装ubuntu及修改安装位置,设置Ubuntu开机启动链接ssh服务
- Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献
- 【Mysql】复合查询详解+实战操作(多表查询、自链接、子查询等)
- 如何将vscode和Linux远程链接:
- 轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码
- 批量替换WordPress文章内图片链接
- 什么是BT种子!磁力链接又是如何工作的?
猜你感兴趣
版权申明
本文"如何链接未被使用的符号":http://eshow365.cn/6-22023-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!