为什么 gcc 链接器选择旧版本的共享库?
我很困惑。我在 /lib 中有 2 个版本的 libssl.so: /lib/libssl.so.4
和 /lib/libssl.so.6
这是一个精简的最小示例 - 我将“无”与 libssl 链接 - - 结果是它链接到libssl.so.4
。是什么决定了这一点?
$ g++ -o foo.so -shared -lssl
$ ldd foo.so |grep ssl
libssl.so.4 => /lib/libssl.so.4 (0xf7f04000)
I'm puzzled. I have 2 versions of libssl.so in /lib:/lib/libssl.so.4
and /lib/libssl.so.6
Here is a stripped down minimal example -- I'm linking "nothing" with libssl -- the result being that it links to libssl.so.4
. What determines this?
$ g++ -o foo.so -shared -lssl
$ ldd foo.so |grep ssl
libssl.so.4 => /lib/libssl.so.4 (0xf7f04000)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
选项
-lssl
指示链接器查找名为libssl.so
或libssl.a
的文件。如果您拥有的只是libssl.so.4
和libssl.so.6
,那么您将遇到链接器错误。在库目录中的某个位置(可能在 /lib 中)查找名为“libssl.so”的符号链接。
The option
-lssl
instructs the linker to look for the file namedlibssl.so
orlibssl.a
. If all you have arelibssl.so.4
andlibssl.so.6
, then you would have a linker error.Look for a symlink called "libssl.so" somewhere in your library directories, likely in /lib.
选项
-lssl
查找linker
库名称,在这种情况下它是libssl.so
。通常,libssl.so 是一个指向soname
库或real
库的符号链接,实际链接是在其中完成的。您应该将libssl.so
符号链接重新指向使用 lib 的正确版本。有关共享实验室命名的更多信息,您可以在此处阅读。
Option
-lssl
looks forlinker
library name, in that case it islibssl.so
. Typically libssl.so would be a symlink pointing tosoname
library orreal
name library whith which actual linking is done. You should repointlibssl.so
symlink to correct version of using lib.More about shared labrary naming you can read here.