我们可以动态链接编译的静态库吗?



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[这是freadscanfcin::operator>>等事物的基础]。

例如,当然,您也可以使用 objdump -d 来查看哪些代码链接到您的应用程序中。

除了出色的 Mats Petersson 答案之外,还有一个很好的工具可以检查动态链接了多少个库,只需键入

> ldd a.out

和输出将包含你的应用链接到的所有共享库

最新更新