demo_lib.h 虚空乐趣();
demo_lib.cpp
#include<iostream>
void fun(){
std::cout << "I am in demo_lib::fun()" << std::endl;
}
编译了静态库
g++ -c demo_lib.cpp -o demo_lib.o
ar rcs libdemo_lib.a demo_lib.a
主.c
#include "demo_lib.h"
int main(){
fun();
return 0;
}
编译的静态
g++ -static main.cpp -L. -ldemo_lib
size of a.out is 1702697 => static linked by linker
无静态编译
g++ main.cpp -L. -ldemo_lib
size of a.out is 9247 => is demo_lib linked dynamically ??
为什么这里的大小差异??
我认为当我们使用 -static 编译器选项时,cpp 库是静态链接
的当我们不 cpp 库是动态链接的,除了demo_lib。
在这两种情况下,demo_lib都是静态链接的,只有 cpp 库不同
我们可以将静态编译库链接为动态库吗?
这是否意味着标准库的默认链接是共享的?
您在 --static
和 not 之间看到的大小差异在于 C 和 C++ 标准库函数是链接的,没有链接。因此,大小差异不是来自您的库(大概只有几百字节,因为它只是对cout::operator<<()
的几次调用,并且应该只产生大约十几条指令[假设 x86,但在 ARM 或 MIPS 上,所有代码的指令不超过 20-25 条]。
不,您不能静态链接共享库,也不能将静态库链接为共享库 - 它们是具有不同内容的不同文件。当你使用 --static
时,编译器(或链接器)将优先选择X.a
而不是X.so
[假设两者都存在]。
添加-Wl,--verbose
将准确显示链接器在链接程序时的作用[或至少比没有链接器更详细],并且将非常清楚地显示有--static
和没有链接器之间的区别。使用--static
,您将获得一大堆行,例如:
(/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/libc.a)read.o
在这种情况下,表示函数read
[这是fread
、scanf
、cin::operator>>
等事物的基础]。
例如,当然,您也可以使用 objdump -d
来查看哪些代码链接到您的应用程序中。
除了出色的 Mats Petersson 答案之外,还有一个很好的工具可以检查动态链接了多少个库,只需键入
> ldd a.out
和输出将包含你的应用链接到的所有共享库