【问题标题】:What does static linking against a library actually do?针对库的静态链接实际上做了什么?
【发布时间】:2010-06-03 10:21:51
【问题描述】:
假设我有一个名为 libfoo 的库,其中包含一个类、一些静态变量、可能带有“C”链接的东西以及一些其他函数。
现在我有一个如下所示的主程序:
int main() {
return 5+5;
}
当我编译和链接这个时,我链接到libfoo。
这会有什么影响吗?我的可执行文件的大小会增加吗?如果是这样,为什么?静态变量或其地址是否被复制到我的可执行文件中?
如果有类似的问题,或者我在任何方面特别愚蠢,我们深表歉意。
【问题讨论】:
标签:
c++
c
linker
static-linking
【解决方案1】:
它不会在现代链接器中做任何事情,因为它知道可执行文件实际上并不使用 libfoo 的符号。在我的系统上使用 gcc 4.4.1 和 ld 2.20:
g++ linker_test.cpp -static -liberty -lm -lz -lXp -lXpm -o linker_test_unnecessary
g++ linker_test.cpp -static -o linker_test_none
ls -l linker_test_unnecessary linker_test_none
它们都是 626094 字节。请注意,这也适用于动态链接,尽管它们的大小要小得多。
【解决方案2】:
库包含以前编译的目标代码 - 基本上,静态库是 .o 或 .obj 文件的存档。
链接器查看您的目标代码并查看是否有任何未解析的名称,如果有,则在库中查找这些名称,如果找到,则包含包含它们的目标文件并重复此操作。
因此只有需要的静态库部分包含在您的可执行文件中。
因此,在您的情况下,libfoo 中的任何内容都不会添加到您的可执行文件中