使用32位支持和自定义OpenSSL版本

时间:2017-09-14 12:56:59

标签: macos libcurl configure

我在Mac OSX版本10.12.6上构建libcurl时遇到了严重问题。

我需要一个特定版本的静态库(7.40.0),与特定版本的OpenSSL(1.0.2c)链接,支持32位架构。

我在官方网站上找到了源代码,并运行了配置脚本,其中包含了正确的参数:

curl-7.40.0> CPPFLAGS="-I/Users/me/Documents/Projects/3rdparty/openssl/MacOSX/openssl-1.0.2c/include/"
LDFLAGS="-L/Users/Documents/Projects/3rdparty/openssl/MacOSX/openssl-1.0.2c/"
./configure --disable-shared --build=i386-darwin --with-ssl

其中:

  • CPPFLAGS指定OpenSSL标头的文件夹;
  • LDFLAGS指定OpenSSL库的文件夹(libssl.alibcrypto.a);
  • --disable-shared禁用动态库的构建(无libcurl.dylib输出);
  • --build=i386-darwin配置Apple 32位目标体系结构的构建;
  • --with-ssl启用SSL选项。

但是,此次通话失败有两个原因:

  1. 查看配置输出,我读到" host system type"被设置为i386-darwin作为目标。我可以通过指定--host=x86_64-darwin;
  2. 来解决此问题
  3. 我确实没有启用SSL:

    configure: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.
    configure: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this.
    
  4. 我当然可以通过指定--with-darwinssl来解决这个问题,但是当我这样做时,我会收到以下警告:

    ld: warning: directory not found for option '-L/Users/me/Documents/Projects/3rdparty/openssl/MacOSX/openssl-1.0.2c'
    

    我试图链接的OpenSSL库被忽略了。

    最后,如果我尝试删除SSL的CFLAGSLDFLAGS(只是为了查看最简单的调用是否有效):

    ./configure --build=i386-darwin --disable-shared --with-darwinssl
    

    当我这样做时,configuremake脚本会很好地结束。如果我尝试在示例源代码中包含curl标题:

    #import <Foundation/Foundation.h>
    #include "curl/curl.h"
    

    并在XCode Headers搜索路径中指定curl-7.40.0/include目录,我遇到了语义问题:

    curl-7.40.0/include/curl/curlrules.h:143:6: '__curl_rule_01__' declared as an array with a negative size
    curl-7.40.0/include/curl/curlrules.h:153:6: '__curl_rule_02__' declared as an array with a negative size
    

    我发现问题描述为here。如果我去检查curlbuild.h #define,我发现CURL_SIZEOF_LONG是8,但是肯定是定义的。该项目使用Architecture i386进行编译。

    最后,如果我尝试简化更多事情并运行不可知论者:

    ./configure --disable-shared --with-darwinssl
    

    并将示例项目架构切换回通用32/64位,当我链接时,我得到了一堆奇怪的错误:

    "_ber_free", referenced from:
    "_inflate", referenced from:
    "_inflateEnd", referenced from:
    "_inflateInit2_", referenced from:
    "_inflateInit_", referenced from:
    "_ldap_err2string", referenced from:
    "_ldap_first_attribute", referenced from:
    "_ldap_first_entry", referenced from:
    "_ldap_free_urldesc", referenced from:
    "_ldap_get_dn", referenced from:
    "_ldap_get_values_len", referenced from:
    "_ldap_init", referenced from:
    "_ldap_memfree", referenced from:
    "_ldap_msgfree", referenced from:
    "_ldap_next_attribute", referenced from:
    "_ldap_next_entry", referenced from:
    "_ldap_search_s", referenced from:
    "_ldap_set_option", referenced from:
    "_ldap_simple_bind_s", referenced from:
    "_ldap_unbind_s", referenced from:
    "_ldap_url_parse", referenced from:
    "_ldap_value_free_len", referenced from:
    "_zlibVersion", referenced from:
    

    我可能要么在这里遗漏了一些明显的东西,要么在路上遗漏了许多小砖块。无论哪种方式,我都完全迷失了,我想知道我的任务是否真的可行。

    我可以重新编译&#39;整个应用程序是64位,但我可能需要这个版本的libcurl那个版本的OpenSSL,如果我甚至不能得到一个示例应用程序在那里切换到真实的东西是没有意义的(如果您对我需要此配置的原因感到好奇,请检查my other thread about libcurl problems:Windows客户端连接没有问题并使用前面提到的配置)。

    你看到我在做什么明显的错误吗?任何帮助或有启发性的问题将不胜感激。

1 个答案:

答案 0 :(得分:1)

我实际上错过了很多步骤,但让我们按时间顺序跟踪问题。

1)OpenSSL编译

我重建了OpenSSL并将其安装在我的Documents文件夹中,运行:

./configure no-shared --openssldir=~/Documents/openssl-lib darwin-i386-cc
make
make install

INSTALL步骤添加了链接器所需的“lib”文件夹。

2)编译libcurl

在实际编译libcurl之前,我必须安装pkg-config

brew install pkg-config

然后我给出了正确的configure命令:

CPPFLAGS="-I/Users/me/Documents/openssl-lib -I/Users/me/Documents/openssl-lib/include"
LDFLAGS="-L/Users/me/Documents/openssl-lib/lib" LIBS="-ldl -lpthread" 
CFLAGS="-arch i386"
./configure --with-ssl=/Users/me/Documents/openssl-lib
    --disable-sharing -build=i386-darwin

现在openssl选项配置正确,因为:

  1. pkg-config已安装;
  2. 我添加了CFLAGS -arch i386
  3. 与正确的openssl版本链接后......

    工作还没完成!因为我仍然需要在我的测试应用程序中链接二进制文件。除libcurl之外,我必须链接

    1. openssl(是的,再次)
    2. LDAP(XCode包含一个框架)
    3. zlib(添加“其他编译器选项”-lz
    4. 之后,我的测试程序与Cloudfront正确连接并显示正确的curl版本。