我在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.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'
我试图链接的OpenSSL库被忽略了。
最后,如果我尝试删除SSL的CFLAGS
和LDFLAGS
(只是为了查看最简单的调用是否有效):
./configure --build=i386-darwin --disable-shared --with-darwinssl
当我这样做时,configure
和make
脚本会很好地结束。如果我尝试在示例源代码中包含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客户端连接没有问题并使用前面提到的配置)。
你看到我在做什么明显的错误吗?任何帮助或有启发性的问题将不胜感激。
答案 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
选项配置正确,因为:
pkg-config
已安装; CFLAGS -arch i386
与正确的openssl版本链接后......
工作还没完成!因为我仍然需要在我的测试应用程序中链接二进制文件。除libcurl
之外,我必须链接
openssl
(是的,再次)LDAP
(XCode包含一个框架)zlib
(添加“其他编译器选项”-lz
之后,我的测试程序与Cloudfront正确连接并显示正确的curl
版本。