网站感谢页面,竞价代运营,网络工程师证书含金量,网推方案如何链接未被使用的符号
我们知道#xff0c;在ld链接静态库过程中#xff0c;通常只有被使用到的符号才回被链接进可执行文件中。
而在某些场景中#xff0c;我们希望在链接的时候也能把未使用的符号也给链接进来。
在ext/mylib.h文件中声明了一个add函数和一个Register…如何链接未被使用的符号
我们知道在ld链接静态库过程中通常只有被使用到的符号才回被链接进可执行文件中。
而在某些场景中我们希望在链接的时候也能把未使用的符号也给链接进来。
在ext/mylib.h文件中声明了一个add函数和一个Register对象
#pragma once#includeiostreamint add(int a, int b);class Register {
public:Register() {std::coutRegister constructor : thisstd::endl;// register}~Register() {}
};在ext/mylib.cc文件中定义了add函数和一个Register静态实例
#includemylib.hint add(int a, int b) {return a b;
}static Register r;将上述文件编译成静态链接库mylib.a
在hello.cc中我们引入了mylib.h头文件现在的问题是Register的构造函数会被调用吗 #includeext/mylib.hint main() {return 0;
}第一种情况我们虽然引入mylib.h文件但是没有调用任何mylib中的符号。执行的结果是 什么也没有输出Register没有被调用说明Register符号并没有被链接进来。
第二种情况我们引入mylib.h文件并且调用add函数 #includeext/mylib.hint main() {add(5,23);return 0;
}编译运行结果是
Register constructor : 0x7ff8e85890e1Register的构造函数被调用了说明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参数。
上述实验仅针对静态链接动态链接待研究。