Gcc 与SONAME共享库的链接

Gcc 与SONAME共享库的链接,gcc,linker,openssl,clang,ld,Gcc,Linker,Openssl,Clang,Ld,如何强制gcc链接器链接系统上共享库的给定版本 我需要这一点来强制执行在任何系统上包含的openssl版本与链接的版本相匹配,即使安装了多个版本的openssl。要查找ABI版本,我的配置脚本首先编译并运行一个程序,从标题中提取SONAME: #include <openssl/opensslv.h> #include <stdio.h> int main () { printf(SHLIB_VERSION_NUMBER); return 0; } 但是,似乎

如何强制gcc链接器链接系统上共享库的给定版本

我需要这一点来强制执行在任何系统上包含的openssl版本与链接的版本相匹配,即使安装了多个版本的openssl。要查找ABI版本,我的配置脚本首先编译并运行一个程序,从标题中提取SONAME:

#include <openssl/opensslv.h>
#include <stdio.h>

int main () {
  printf(SHLIB_VERSION_NUMBER);
  return 0;
}
但是,似乎找不到链接器libcrypto.so.1.1.0:

gcc: error: libcrypto.so.1.1.0: No such file or directory

我猜当使用-l标志时,系统只在标准位置进行搜索。有没有更好的方法使我的软件链接与libcrypto.so.1.1.0相对应?

要选择正确版本的openssl共享库,请使用:

gcc main.c -l:libssl.so.1.0.0 -l:libcrypto.so.1.0.0
回答这个问题的关键是如何控制ld,以便它是共享库的正确版本

使用gnu编译器gcc、g++、gdc等将链接器标志和命令行参数传递给ld的正确方法。。。是使用前缀为-l的普通ld参数。例如-lssl或-L/usr/local/lib


编辑:根据,您可以使用:man ld阅读ld手册。

我认为您编写的内容要求gcc尝试编译libcrypto.so.1.1.0,而不是链接它。有一种方法可以分阶段编译文件,然后再链接。@ThomasHedden:你的假设是错误的。如果您在那里传递了一个共享对象的绝对路径,它将链接到它,这是非常好的。当像这样链接时:gcc main.c libcrypto.so.1.1.0,那么libcrypto.so.1.1.0需要位于路径和链接/加载程序路径上。您可以执行gcc main.c/usr/local/lib64/libcrypto.so.1.1.0-o my_prog来帮助解决编译问题,但我不确定在运行时会发生什么。在运行时,您可能需要一些技巧,如LD_LIBRARY=/usr/local/lib64/libcrypto.so.1.1.0./my_prog。我还知道使用staic归档文件的效果与预期一样:gcc main.c/usr/local/lib64/libcrypto.a-o my_prog。我经常使用它来避免所有的运行时链接问题。
gcc main.c -l:libssl.so.1.0.0 -l:libcrypto.so.1.0.0