假设我有一个名为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
一个库包含先前编译的目标代码 - 基本上,静态库是 .o 或 .obj 文件的归档。
链接器查看您的目标代码,查看是否存在任何未解析的名称,如果存在,则在库中查找这些名称,如果找到它们,则包含包含它们的目标文件并重复此过程。
因此,只有需要的静态库部分包含在您的可执行文件中。
因此,在您的情况下,不会将 libfoo 中的任何内容添加到您的可执行文件中。