编译时,OpenSSL 标头与当前版本不匹配



尝试编译freeRADIUS服务器2.2.3时,我收到以下错误消息:

checking for OpenSSL version >= 0.9.7... yes
checking OpenSSL library and header version consistency... library: 90819f header: 90812f... no
configure: error: in `/Users/tyrexionibus/Downloads/freeradius-server-2.2.3':
configure: error: OpenSSL library version does not match header version

实际上,openSSL版本是:

tyrexionibus$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

位于/usr/include/openssl/opensslv.h 中的标头包含:

#define OPENSSL_VERSION_NUMBER 0x0090819fL

编辑它并不能解决问题。

我该如何解决这个问题?

尝试删除libssl-dev并安装libssl1.0-dev

  1. sudo apt remove libssl-dev
  2. sudo apt install libssl1.0-dev

这对我有用

问题是编译器和链接器搜索路径通常不一致。

默认情况下(除非使用 -isystem 或 -I 修改),GCC 搜索路径为:

/
  • usr/local/include
  • libdir/gcc/target/version/include
  • /
  • usr/target/include
  • /
  • usr/include

默认情况下(除非使用 -L 修改),Apple 的链接器的搜索路径为:

/
  • usr/lib
  • /
  • usr/local/lib

默认情况下(至少在 Ubuntu 13.04 上使用 2.23.52.20130913)(除非使用 -L 修改)GNU 链接器的搜索路径为:

/
  • usr/local/lib:
  • /
  • lib/x86_64-linux-gnu:
  • /
  • usr/lib/x86_64-linux-gnu:
  • /
  • usr/lib/x86_64-linux-gnu/mesa:
  • /自由:
  • /
  • usr/lib:

当系统上安装了多个版本时,链接器和编译器可能会选取完全不同的库标头和二进制文件版本。然后,编译器可能会发出与库的 ABI 不兼容的代码,这些代码具有未定义且通常不希望的行为。这就是添加检查的原因。

为了确保一致性,您应该将 --with-openssl-include= 和 --with-openssl-libraries= 标志传递给配置脚本。然后,编译器和链接器将首先搜索这些目录。

./configure --with-openssl-includes=/usr/include --with-openssl-libraries=/usr/lib

将导致捆绑或打包的 OpenSSL 库/标头在大多数系统上使用。

另一种选择是在配置时设置LD_LIBRARY_PATH,尽管您还需要在 init 脚本中设置此设置,否则运行时版本检查(是的,我们很彻底)将失败。

在 OSX 10.10(优胜美地)中,我必须使用brew自定义安装openssl

$ brew update
$ brew install openssl
$ brew link --force openssl

验证版本。

$ openssl version
OpenSSL 1.0.2 22 Jan 2015

我可以看到它链接到哪个库。

$ otool -L /usr/local/bin/openssl
/usr/local/bin/openssl:
/usr/local/Cellar/openssl/1.0.2/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/Cellar/openssl/1.0.2/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

在我的配置脚本中,我可以指定OpenSSL路径。

$ ./configure --with-ssl-dir=/usr/local/Cellar/openssl/1.0.2

您可能应该检查configure生成的config.log(在同一文件夹中):似乎您至少有 2 个甚至 3 个版本的 OpenSSL:0.9.8r、0.9.8y 和 1.0.1f。

解释:

1)OPENSSL_VERSION_NUMBER=0x0090819f/usr/include/openssl/opensslv.h表示0.9.8y被安装到/usr中;

2)命令openssl version的输出表明您在PATH中的某个地方1.0.1f,但1.0.1fOPENSSL_VERSION_NUMBER定义为0x1000106fL,而不是0x0090819f,因此它与上面的1)不同。

tyrexionibus$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

3)90812f在配置的输出中表示0.9.8r

您可能还会发现 OpenSSL 版本矩阵可用于将十六进制版本号(来自 opensslv.h)与人类可读的版本字符串进行匹配。

只是不要忘记在/etc/ld.so.conf 中添加行

/usr/local/ssl/lib

并运行 LDCONFIG。

如果没有这一步,你的libssl使用系统lybcrypto而不是你的。

比较

BEFORE:
=======
[root]/usr/local/ssl/lib> ldd ./libssl.so
linux-vdso.so.1 (0x00007ffe4c93f000)
libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007febbdcd3000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007febbdacf000)
libc.so.6 => /lib64/libc.so.6 (0x00007febbd702000)
/lib64/ld-linux-x86-64.so.2 (0x0000558484e69000)
AFTER:
======
[root]/usr/local/ssl/lib> ldd ./libssl.so
linux-vdso.so.1 (0x00007ffcec2aa000)
libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0    (0x00007fa347db5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fa347bb0000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa3477e4000)
/lib64/ld-linux-x86-64.so.2 (0x00005567459c7000)

发现这个时我真的很高兴:=)

试试这个

./configure --with-openssl-lib-dir=/usr/local/openssl/lib/ --with-openssl-include-dir=/usr/local/openssl/include/

这为我修复了它...

sudo apt-get install libssl-dev

最新更新