哪个目录是openssldir?

时间:2014-07-25 15:33:28

标签: compilation openssl

编译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可用。这是指向prefixopenssldir提供的OpenSSL编译选项吗?

注意:我没有编译tinc,这只是我用清晰的例子找到的第一件事。

3 个答案:

答案 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编译选项吗?

是(但这取决于)。我曾与许多项目合作过,这些项目无法正确附加includelib

那些--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