链接共享库时能否无需同时链接其依赖库?
问题
假设我有一个名为libfoo.so的共享库,它依赖于其他库,依赖关系如下:
libfoo.so -> libbar.so libsomething.so libother.so -> libstuff.so
现在我有一段代码需要链接libfoo.so,是否可以仅链接libfoo.so而无需同时提供它所依赖的所有库?例如使用如下命令:
gcc my.c -o hello-world -lfoo
回答
可以,你完全只需要链接libfoo.so就行,不用手动指定它依赖的所有库,原因如下:
- 共享库的依赖信息会嵌入到库文件本身中,当你使用
-lfoo参数链接时,链接器会自动读取libfoo.so里记录的依赖项,自动查找并链接这些依赖库(包括libother.so的依赖libstuff.so)。 - 只要所有依赖的共享库都在系统标准库路径(比如
/usr/lib、/lib),或者你通过-L参数指定了它们的存放目录,这条gcc命令就能正常完成链接。 - 只有一种特殊情况需要手动补全依赖:如果某个依赖库不在链接器的搜索路径内,且libfoo.so里没有记录它的绝对路径,这时候可能需要你手动添加
-lbar、-lsomething这类参数,或者通过设置LD_LIBRARY_PATH环境变量让链接器找到对应的库。
内容的提问来源于stack exchange,提问作者Maxthecat
相关产品推荐
相关产品推荐

