4

假设我有一个名为的库libfoo,其中包含一个类、一些静态变量、可能带有“C”链接的东西以及一些其他函数。

现在我有一个如下所示的主程序:

int main() {
   return 5+5;
}

当我编译和链接这个时,我链接到libfoo.

这会有什么影响吗?我的可执行文件的大小会增加吗?如果是这样,为什么?静态变量或其地址是否被复制到我的可执行文件中?

抱歉,如果有类似的问题,或者我在任何方面都特别愚蠢。

4

2 回答 2

6

它不会在现代链接器中做任何事情,因为它知道可执行文件实际上并不使用 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 字节。请注意,这也适用于动态链接,尽管它们的大小要小得多。

于 2010-06-03T10:25:40.467 回答
4

库包含先前编译的目标代码 - 基本上静态库是 .o 或 .obj 文件的存档。

链接器查看您的目标代码并查看是否有任何未解析的名称,如果有,则在库中查找这些名称,如果找到它们,则包含包含它们的目标文件并重复此操作。

因此,只有需要的静态库部分包含在您的可执行文件中。

因此,在您的情况下,libfoo 中的任何内容都不会添加到您的可执行文件中

于 2010-06-03T10:27:02.713 回答