Linux下.so库在CMakeLists与ldd输出中名称差异相关问题
Linux动态链接库相关问题解答
1. ldd输出的信息来源及YYY.so的由来
ldd的输出取自可执行文件的动态依赖表,其中的YYY.so完全来自你提到的第三方库libXXX.so的SONAME字段。你用readelf -d libXXX.so看到的SONAME: [YYY.so]就是核心——当链接器链接libXXX.so时,会读取这个SONAME值,并将其写入生成的可执行文件的动态依赖列表中,而非使用你指定的XXX或库文件名libXXX.so。
2. CMakeLists中的XXX与ldd输出的YYY名称不同是否有影响?
只要你通过ln -s libXXX.so YYY.so创建了软链接,让动态加载器能找到YYY.so对应的实际库文件,就不会影响程序运行:
- 编译链接阶段:CMake中指定XXX,链接器会自动查找
libXXX.so(链接器默认遵循lib{name}.so的命名规则),读取其SONAME后写入可执行文件的依赖列表。 - 运行阶段:动态加载器会根据可执行文件中记录的YYY.so查找库文件,你创建的软链接刚好匹配这个需求,因此程序可以正常运行。
3. 为何ldd显示YYY.so而非libYYY.so?这是否有影响?谁决定ldd的输出?
- 显示YYY.so的原因:完全由第三方库
libXXX.so内部的SONAME字段决定,库的编译者设置的SONAME是YYY.so,ldd就会输出这个值,和常规的libxxx.so命名规范无关。 - 是否有影响:只要动态加载器能找到YYY.so(比如你创建的软链接),就没有任何影响。
libxxx.so只是行业约定的命名格式,并非强制要求,动态加载器只认SONAME中指定的名称。 - 决定ldd输出的主体:ldd读取的是可执行文件动态依赖列表中的名称,而这个名称是链接器在编译阶段从库的SONAME字段获取的,最终由第三方库的编译者在构建库时设置的SONAME决定。
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

