【问题标题】:Linking dynamic library链接动态库
【发布时间】:2018-04-15 11:55:03
【问题描述】:
我想确切地知道在动态库的情况下链接过程是如何工作的。正如我已经知道的那样,它首先将图像/二进制文件加载到内存中,并且(对于每个程序调用/链接库)它被调用。但我的问题如下:程序如何区分共享库和静态库?只有.so和.a?如果我链接像 /path/to/so/file.so 这样的动态库的完整路径,这听起来很傻,但它会变成静态并且内容被复制到可执行二进制文件中吗?
谢谢...
【问题讨论】:
标签:
c++
dynamic
compilation
linker
【解决方案1】:
不,为链接器提供完整路径不会将库变成静态库。
哪些代码将成为二进制文件的一部分的“决定”发生在编译时。加载二进制文件时,加载程序可以加载其他库(动态),但它们不是二进制文件本身的一部分(即编译完成后二进制文件的大小不会改变)。
加载器可以通过检查库的目标文件来区分静态库和动态库。该文件是在编译过程中生成的(例如在 Linux gcc 上使用“-shared”),即编译的静态库与动态编译的库具有不同的目标文件格式。
提供链接器的完整路径与链接器搜索库文件以进行编译的方式有关(或者稍后在加载器上寻找系统上的共享库时)。它不会影响库的类型(在编译时已“选择”)。