gpt4 book ai didi

c++ - Linux C++编程:Why is the connection is . so,生成的可执行依赖库为.so.version

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:10 26 4
gpt4 key购买 nike

用eclipse写C++程序可以编译成功,但是执行时找不到动态库。使用 'ldd' 显示 xxx.12=> 未找到。那么为什么依赖库.so重命名呢?

最佳答案

我找到了答案:-Wl 选项告诉编译器将后续参数传递给链接器。-soname 指定动态库的soname(共享对象名的缩写)。-Wl表示后面的参数是-soname,libhello.so.1直接传给connector ld处理。事实上,每个库都有一个 soname。当连接器在它正在寻找的库中找到一个名称时,连接器将在链接中的二进制文件中嵌入 soname,而不是它正在运行的实际文件名。在程序执行过程中,程序查找名称为 soname 的文件,而不是库的文件名。换句话说,soname是库的区别标志。这样做的主要目的是让多个版本的库文件在系统中共存。命名库文件时习惯使用与soname相同的名称。Libxxxx.so.major.minor其中 xxxx 是库的名称,major 是主版本号,minor 是次版本号。简单来说soname就是指定库的名字,不管生成的库是什么名字。在做连接时,将soname指定的名称添加到可执行文件中,运行程序加载soname指定的库。文件名。所以如果程序连接的是新升级的库,只需要将新库复制到目录下,然后用sonamed soname 调用即可。如果升级了库,但程序仍然使用旧的链接库,那么只需将旧库名链接到新升级的库即可。soname 的关键功能是它提供了一个兼容性标准:当你想升级系统中的一个库,而新库的soname与旧库的soname相同时,旧库链接生成的程序仍然可以正常使用新库。该特性使得在 Linux 下升级共享库程序和位置错误变得容易。

在 Linux 中,应用程序使用 soname 指定所需库的版本。库作者可以通过保留或更改soname来声明兼容哪些版本,从而使程序员免于共享库版本冲突。可以使用readelf -d查看各个动态库的SONAME————————————————版权声明:本文为CSDN博主《寻找大海中的小鱼》原创文章,遵循CC 4.0 BY-SA版权协议(protocol),转载请转载原文出处链接及本声明。原文链接:https://blog.csdn.net/wang_hufeng/article/details/53899120

关于c++ - Linux C++编程:Why is the connection is . so,生成的可执行依赖库为.so.version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58443388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com