针对库的静态链接实际上是干什么的?

问题描述:

假设我有一个名为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中没有东西会被添加到你的可执行文件中