【问题标题】: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 中的任何内容都不会添加到您的可执行文件中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-02
        • 2020-11-21
        • 2015-02-26
        • 2017-06-29
        • 2013-06-13
        • 2021-10-25
        • 2011-08-12
        • 1970-01-01
        相关资源
        最近更新 更多