c++ - 为什么将静态 libcurl.a 添加到 xcode 7.2 示例项目将添加 libcurl.4.dylib 依赖项

标签 c++ xcode curl linker xcode7

我一直在尝试通过将 libcurl.a 添加到我的 Xcode 7.2 项目来消除对 libcurl.4.dylib 的任何依赖。我构建了一个全新的 libcurl 并将其放在/usr/local/lib 中(标题位于/usr/local/include/curl 中):

export MACOSX_DEPLOYMENT_TARGET="10.8"
./configure --disable-shared --with-darwinssl
make clean
make
make install

但是 .app 仍然与对 libcurl.4.dylib 的依赖关系相关联。找出原因需要几天时间。

虽然我将 libcurl.a 添加到我的 Xcode“将二进制文件与库链接”构建阶段,但 Xcode 生成的 -lcurl 链接命令告诉链接器, 默认情况下,链接到 DYNAMIC 库。链接器不会接受 -static 作为-l 的前缀,因为 CLANG 驱动程序不支持 在每个文件的基础上打开/关闭-static/-dynamic(如果链接器确实看到-static,它期望一切都是静态的——Apple 强烈反对这一点)。

一旦我更改(在 MANUAL shell 链接行中)Xcode 生成的 -lcurl 明确为“/usr/local/lib/libcurl.a”,链接的 .app 不再显示对 libcurl.4 的依赖性。动态库。

糟糕的是,似乎没有简单的方法可以通过 Xcode — 除非我用不同的名称制作 libcurl.a 的拷贝。

也许其他人知道 Xcode 7.2 的“神奇”参数/构建选项,或者有更多见解,但我想把它留在这里,以防其他人遇到 libcurl 的这个问题——或任何其他静态 (.a)在同一位置恰好有同名动态 (.dylib) 的库。

斯蒂芬

编辑:这是我用来构建通用静态库的命令行:

export MACOSX_DEPLOYMENT_TARGET="10.10"
./configure --prefix=$HOME CFLAGS="-arch i386 x86_64" LDFLAGS="-arch i386 x86_64" --disable-shared --with-darwinssl --without-zlib  --without-libidn --disable-ldap
make clean
make
sudo make install

最佳答案

我尝试了 SMGreenfield 建议的方法,但它对我不起作用。原因之一:该库无法在通用环境中使用,因为文件 curlbuild.h 因每个体系结构而异。使用此作为来源 https://curl.haxx.se/mail/lib-2015-08/0146.html ,我做了以下事情。还不能做很多测试,但是库编译没有错误“curl_rule_01 declared as an array with negative size”。

  1. 构建 64 位静态 libcurl:

将 CURL 源文件下载到:/Users/yourname/Libs/

创建文件夹 /Users/yourname/Libs/curl_64

在终端中输入:

$ cd /Users/yourname/Libs/curl-7.52.1
$ export MACOSX_DEPLOYMENT_TARGET="10.7"
$ export CFLAGS="-arch x86_64"
$ export LDFLAGS="-arch x86_64"
$ ./configure --prefix=/Users/yourname/Libs/curl_64 --disable-shared -–enable-static --without-libidn –-without-zlib -–disable-ldap
$ make clean
$ make
$ make install
  1. 构建 32 位静态 libcurl:

创建文件夹 /Users/yourname/Libs/curl_32

在终端中输入:

$ cd /Users/yourname/Libs/curl-7.52.1
$ export MACOSX_DEPLOYMENT_TARGET="10.7"
$ export CFLAGS="-arch i386"
$ export LDFLAGS="-arch i386"
$ ./configure --prefix=/Users/yourname/Libs/curl_32 --disable-shared –-enable-static --without-libidn –-without-zlib -–disable-ldap
$ make clean
$ make
$ make install
  1. 创建通用 libcurl:

创建文件夹 /Users/yourname/Libs/curl_universal/lib

Lipo 两个静态库:

lipo -create /Users/yourname/Libs/curl_32/lib/libcurl.a /Users/yourname/Libs/curl_64/lib/libcurl.a –output /Users/yourname/Libs/curl_universal/libcurl.a

将所有子文件夹从 /Users/yourname/Libs/curl_64 复制到 /Users/yourname/Libs/curl_universal 子文件夹除外 lib!

在文件夹 /Users/yourname/Libs/curl_universal/include/curl 中复制文件 curlbuild.h 并另存为 curlbuild64.h。将此文件从文件夹 /Users/yourname/Libs/curl_32/include/curl 复制到文件夹 /Users/yourname/Libs/curl_universal/include/curl 并将其另存为 <强>curlbuild32.h。现在我们应该有三个文件:curlbuild.hcurlbuild64.hcurlbuild32.h

  1. 打开文件 curlbuild.h 并编辑如下:

enter image description here

关于c++ - 为什么将静态 libcurl.a 添加到 xcode 7.2 示例项目将添加 libcurl.4.dylib 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566824/

相关文章:

c++ - Xerces DOMNode 将节点名称返回为#Text

arrays - 如何将数组元素按顺序保存到Core Data中

ios - 如何设置初始 Storyboard

c++ - 在 win C++ 应用程序中使用 curl

curl - 如何使用 cURL 连接到 Google Drive API?

C++ 将静态库添加到 CMake 项目导致 undefined reference

c++ - 什么时候适合使用 C++11 *_until 超时函数而不是相应的 *_for 函数?

c++ - 在同一个 fstream 对象上使用 getline 的两个函数 c++

iphone - 应用程序在 iphone 上运行良好但在模拟器中失败

java - Swig:将无符号字符数组从 C++ 传递到 Java