编译OpenSSL时,您可以添加2个选项(来自INSTALL in the OpenSSL sources):
Configuration Options
---------------------
There are several options to ./config (or ./Configure) to customize
the build:
--prefix=DIR Install in DIR/bin, DIR/lib, DIR/include/openssl.
Configuration files used by OpenSSL will be in DIR/ssl
or the directory specified by --openssldir.
--openssldir=DIR Directory for OpenSSL files. If no prefix is specified,
the library files and binaries are also installed there.
在编译依赖OpenSSL或可以添加的其他内容时,可以选择一个选项,例如:对于tinc,--with-openssl
可用。这是指向prefix
或openssldir
提供的OpenSSL编译选项吗?
注意:我没有编译tinc,这只是我用清晰的例子找到的第一件事。
答案 0 :(得分:9)
您还可以运行此命令来标识将其安装到的目录。
openssl version -d
答案 1 :(得分:8)
这是openssldir?
默认情况下,OpenSSL目录为/usr/local/ssl
。如果您执行的config
没有--prefix
且没有--openssldir
,那么这就是您默认获得的内容。
标题将位于/usr/local/ssl/include/openssl
,图书馆将位于/usr/local/ssl/lib
。
您应该更喜欢--openssldir
,并避免使用像--prefix=/usr
这样的聪明技巧来覆盖发行版的发行版。
如果您想提供更新的OpenSSL版本,请按照Personal Package Archive (PPA)所述,构建自定义程序包(Override Distro Package with Custom Package?)。
我目前正在使用OS X 10.8.5。这是/usr/local/ssl
的样子(由于多个OpenSSL版本,我在--openssldir
上使用了一个额外的目录路径):
$ ls /usr/local/ssl/
android-14 darwin macosx-x64
android-18 ios macosx-x86
--with-openssl可用。这应该指向给予prefix或openssldir的OpenSSL编译选项吗?
是(但这取决于)。我曾与许多项目合作过,这些项目无法正确附加include
和lib
。
那些--with-openssl
的图书馆常常以微妙的方式被打破。例如,假设您执行以下操作:
export CFLAGS="-I/usr/local/ssl/include"
export LDFLAGS="/usr/local/ssl/lib"
./config ... --with-openssl=/usr/local/ssl
make
sudo make install
在上文中,您将编译并链接/usr/local/ssl
中的齿轮。然后,当您执行程序时,它将链接到/usr/lib
中的共享对象,而不是/usr/local/ssl/lib
中的共享对象。
如果您的发行版提供0.9.8并且/usr/local/ssl
中有1.0.1,那么您将会遇到许多无法解释的无法解决的崩溃问题。请注意OS X上的这个问题,因为Apple提供了0.9.8。
如果您和发行版都提供二进制兼容的东西(如1.0.1),那么您将缺少功能而无需解释。例如,您的OpenSSL版本将启用TLS 1.1和1.2,而Ubuntu的版本将禁用TLS 1.1和1.2(Ubuntu priot到14使用-DOPENSSL_NO_TLS1_2_CLIENT
构建)。而且你会想知道为什么你不能使用TLS 1.2进行连接。
如果您在OS X上进行编译,那么您会发现OS X默默地丢弃您执行静态链接的请求(即-Bstatic -lcrypto -lssl
)。如果可用,链接器总是使用共享对象(即使在iOS上,也不允许这样做!)。而且它也会默默地忽略你的-rpath
。忘了LD_LIBRARY_PATH
,因为它没有兑现(你必须每dyld(1)
使用DYLD_LIBRARY_PATH
)。
应对OS X的最简单方法是:
cd <project>
grep -R "-lcrypto" *
<replace all occurences of -lcrypto with /usr/local/ssl/lib/libcrypto.a>
grep -R "-lssl" *
<replace all occurences of -lssl with /usr/local/ssl/lib/libssl.a>
档案就像目标文件(它们是目标文件的集合),所以你甚至不需要-l
。
如上所述强制进行静态链接时,您不必担心链接器会默默地丢弃您的请求或执行您不期望的操作。同样适用于Linux。事实上,我总是使用我自己的OpenSSL版本,而且我总是按照我的描述做,因为我厌倦了与各种工具的斗争(它不仅仅是ld
,它的Eclipse
和朋友,也是)。
答案 2 :(得分:2)
在编译依赖OpenSSL的其他东西时,为了正确编译,他们通常需要的是openssl二进制文件 - crypto和ssl(linux) - (用于链接)和包含文件。
所以,你最好的尝试是指出你用来安装openssl
的--prefix