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

问题描述 投票:6回答:7

在尝试编译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

编辑它并不能解决问题。

我该如何解决这个问题?

header openssl freeradius
7个回答
2
投票

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

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

  • 在/ usr /本地/包括
  • LIBDIR / GCC /目标/版本/包括
  • 的/ usr /目标/包括
  • / 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 /台面:
  • / lib目录下:
  • / usr / lib目录:

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

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

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

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

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


2
投票

在OSX 10.10(Yosemite)中,我必须使用openssl自定义安装brew

$ 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

1
投票

您应该检查由config.log生成的configure(在同一文件夹中):看起来您至少有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

您还可以找到an OpenSSL version matrix,它可以将十六进制(来自opensslv.h)的版本号与人类可读的版本字符串相匹配。


1
投票

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

  1. sudo apt删除libssl-dev
  2. sudo apt install libssl1.0-dev

这对我有用


0
投票

只是不要忘记在/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)

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


0
投票

试试这个

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

0
投票

这为我修好了......

sudo apt-get install libssl-dev
© www.soinside.com 2019 - 2024. All rights reserved.