在具有 32 位支持和自定义 OpenSSL 版本的 MacOSX 上构建 libcurl

Build libcurl on MacOSX with 32 bit support and custom OpenSSL version

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

我需要特定版本的静态库 (7.40.0),link使用特定版本的 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

其中:

但是,由于两个原因,此调用失败:

  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.
    

当然我可以通过指定 --with-darwinssl 来解决这个问题,但是当我这样做时我会收到以下警告:

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

我正在尝试 link 的 OpenSSL 库被忽略了。

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

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

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

#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

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

最后,如果我尝试进一步简化事情并且 运行 一个不可知论者:

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

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

"_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:

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

我可以 'recompile' 整个 64 位应用程序,但我可能需要 this 版本的 libcurlthat 版本的 OpenSSL,如果我什至无法运行示例应用程序,那么切换到真实的应用程序就没有意义(如果您对我为什么需要此配置感到好奇,请查看 my other thread about libcurl problems:Windows客户端连接没有问题,正在使用上述配置。

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

我实际上错过了很多步骤,但让我们按时间顺序关注这些问题。

1) OpenSSL 编译

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

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

INSTALL 步骤添加了 linker 需要的 "lib" 文件夹。

2) 编译libcurl

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

brew install pkg-config

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

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

使用正确的 openssl 版本link后...

作业还没有完成!因为我的测试应用程序中仍然需要 link 二进制文件。除了 libcurl 我不得不 link

  1. openssl(是的,又一次)
  2. LDAP(XCode 包括一个框架)
  3. zlib(加一个"Other Compiler Option"-lz

之后,我的测试程序与 Cloudfront 正确连接并显示正确的 curl 版本。