假设我有一个名为的库libfoo
,其中包含一个类、一些静态变量、可能带有“C”链接的东西以及一些其他函数。
现在我有一个如下所示的主程序:
int main() {
return 5+5;
}
当我编译和链接这个时,我链接到libfoo
.
这会有什么影响吗?我的可执行文件的大小会增加吗?如果是这样,为什么?静态变量或其地址是否被复制到我的可执行文件中?
抱歉,如果有类似的问题,或者我在任何方面都特别愚蠢。
假设我有一个名为的库libfoo
,其中包含一个类、一些静态变量、可能带有“C”链接的东西以及一些其他函数。
现在我有一个如下所示的主程序:
int main() {
return 5+5;
}
当我编译和链接这个时,我链接到libfoo
.
这会有什么影响吗?我的可执行文件的大小会增加吗?如果是这样,为什么?静态变量或其地址是否被复制到我的可执行文件中?
抱歉,如果有类似的问题,或者我在任何方面都特别愚蠢。
它不会在现代链接器中做任何事情,因为它知道可执行文件实际上并不使用 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 字节。请注意,这也适用于动态链接,尽管它们的大小要小得多。
库包含先前编译的目标代码 - 基本上静态库是 .o 或 .obj 文件的存档。
链接器查看您的目标代码并查看是否有任何未解析的名称,如果有,则在库中查找这些名称,如果找到它们,则包含包含它们的目标文件并重复此操作。
因此,只有需要的静态库部分包含在您的可执行文件中。
因此,在您的情况下,libfoo 中的任何内容都不会添加到您的可执行文件中