在具有 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
其中:
CPPFLAGS
指定OpenSSL的文件夹headers;
LDFLAGS
指定 OpenSSL 库的文件夹 (libssl.a
, libcrypto.a
);
--disable-shared
禁用动态库的构建(无 libcurl.dylib
输出);
--build=i386-darwin
为 Apple 32 位目标架构配置构建;
--with-ssl
启用 SSL 选项。
但是,由于两个原因,此调用失败:
- 查看配置输出,我读到“
host system type
”设置为 i386-darwin
作为目标。我可以通过指定 --host=x86_64-darwin
; 来解决这个问题
我知道 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 删除 CFLAGS
和 LDFLAGS
(只是为了看看最简单的调用是否有效):
./configure --build=i386-darwin --disable-shared --with-darwinssl
当我这样做时,configure
和 make
脚本会很好地结束。如果我尝试在示例源代码中包含 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
#define
s,我发现 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 版本的 libcurl
和 that 版本的 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
选项已正确配置,因为:
pkg-config
已安装;
- 我加了一个
CFLAGS -arch i386
使用正确的 openssl 版本link后...
作业还没有完成!因为我的测试应用程序中仍然需要 link 二进制文件。除了 libcurl
我不得不 link
openssl
(是的,又一次)
LDAP
(XCode 包括一个框架)
zlib
(加一个"Other Compiler Option"-lz
之后,我的测试程序与 Cloudfront 正确连接并显示正确的 curl
版本。
我在 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
其中:
CPPFLAGS
指定OpenSSL的文件夹headers;LDFLAGS
指定 OpenSSL 库的文件夹 (libssl.a
,libcrypto.a
);--disable-shared
禁用动态库的构建(无libcurl.dylib
输出);--build=i386-darwin
为 Apple 32 位目标架构配置构建;--with-ssl
启用 SSL 选项。
但是,由于两个原因,此调用失败:
- 查看配置输出,我读到“
host system type
”设置为i386-darwin
作为目标。我可以通过指定--host=x86_64-darwin
; 来解决这个问题
我知道 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 删除 CFLAGS
和 LDFLAGS
(只是为了看看最简单的调用是否有效):
./configure --build=i386-darwin --disable-shared --with-darwinssl
当我这样做时,configure
和 make
脚本会很好地结束。如果我尝试在示例源代码中包含 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
#define
s,我发现 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 版本的 libcurl
和 that 版本的 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
选项已正确配置,因为:
pkg-config
已安装;- 我加了一个
CFLAGS -arch i386
使用正确的 openssl 版本link后...
作业还没有完成!因为我的测试应用程序中仍然需要 link 二进制文件。除了 libcurl
我不得不 link
openssl
(是的,又一次)LDAP
(XCode 包括一个框架)zlib
(加一个"Other Compiler Option"-lz
之后,我的测试程序与 Cloudfront 正确连接并显示正确的 curl
版本。