您可以将其视为 如何在 Ubuntu 上安装 OpenSSL C++ 库的后续问题?
我正在尝试在需要 OpenSSL 1.0.0 的 Ubuntu 10.04 LTS 上构建一些代码。
Ubuntu 10.04 LTS 附带 OpenSSL 0.9.8k:
$ openssl version
OpenSSL 0.9.8k 25 Mar 2009
因此,在运行 sudo apt-get install libssl-dev
并构建之后,运行 ldd 确认我已在 0.9.8 中链接:
$ ldd foo
...
libssl.so.0.9.8 => /lib/i686/cmov/libssl.so.0.9.8 (0x00110000)
...
libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0x002b0000)
...
如何安装 OpenSSL 1.0.0 和 1.0.0 开发包?
更新:我在阅读 SB 的答案(但在尝试之前)之后编写此更新,因为很明显我需要解释下载和安装 OpenSSL 1.0.0 的明显解决方案不起作用:
成功执行以下操作后(建议在安装文件中):
$ ./config
$ make
$ make test
$ make install
…我仍然得到:
OpenSSL 0.9.8k 25 Mar 2009
…和:
$ sudo apt-get install libssl-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
libssl-dev is already the newest version.
The following packages were automatically installed and are no longer required:
linux-headers-2.6.32-21 linux-headers-2.6.32-21-generic
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
…并且(只是为了确保)在重建我的代码后, ldd 仍然返回相同的内容。
更新 #2 :我在 makefile 中添加了“-I/usr/local/ssl/include”和“-L/usr/local/ssl/lib”选项(由 SB 建议),但我现在得到了一堆未定义参考编译错误,例如:
/home/dspitzer/foo/foo.cpp:86: undefined reference to `BIO_f_base64'
/home/dspitzer/foo/foo.cpp:86: undefined reference to `BIO_new'
/usr/local/ssl/include/ 仅包含一个 openssl 目录(其中包含许多 .h 文件),所以我也尝试了“-I/usr/local/ssl/include/openssl”,但得到了相同的错误。
更新 #3 :我尝试更改 OpenSSL 包括(例如):
#include <openssl/bio.h>
…至:
#include "openssl/bio.h"
…在 .cpp 源文件中,但仍然得到相同的未定义引用错误。
更新#4 :我现在意识到那些未定义的引用错误是链接器错误。如果我从我的 Makefile 中删除“-L/usr/local/ssl/lib”,我不会收到错误(但它链接到 OpenSSL 0.9.8)。 /usr/local/ssl/lib/ 的内容是:
$ ls /usr/local/ssl/lib/
engines libcrypto.a libssl.a pkgconfig
我添加了-lcrypto,错误就消失了。
原文由 Daryl Spitzer 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 这里 获取 1.0.0a 源代码。
注意:如果您在现代系统上有 手册页构建错误,请使用
make install_sw
而不是make install
。默认情况下,这会将其放在 /usr/local/ssl
构建时,您需要告诉 gcc 在 /usr/local/ssl/include 中查找头文件并与 /usr/local/ssl/lib 中的库链接。您可以通过执行以下操作来指定:
编辑 不要覆盖任何系统库。最好将新库保存在 /usr/local 中。覆盖 Ubuntu 默认设置可能会危害您的健康并破坏您的系统。
此外,我刚刚在 Ubuntu 10.04 VM 中尝试过的路径是错误的。固定的。
请注意,无需更改 LD_LIBRARY_PATH 因为默认情况下链接的 openssl 库是静态库(至少默认情况下 - 可能有一种方法可以在 ./config 步骤中将它们配置为动态库)
您可能需要链接 libcrypto,因为您正在使用一些在 libcrypto 包中构建和定义的调用。 Openssl 1.0.0 实际上构建了两个库,libcrypto 和 libssl。
编辑 2 添加
-lcrypto
到 gcc 行。