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

时间:2016-02-23 00:52:48

标签: c++ xcode curl linker xcode7

我一直试图通过在我的Xcode 7.2项目中添加libcurl.a来消除对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“Link Binary with Libraries”构建阶段,但Xcode生成的链接命令-lcurl告诉链接器, 默认情况下,链接到DYNAMIC库。链接器不接受 -static作为-l的前缀,因为CLANG驱动程序不支持 在每个文件的基础上打开/关闭-static / -dynamic(如果链接器确实看到-static,它希望一切都是静态的 - Apple强烈存在的错误)。

一旦我改变了(在MANUAL shell链接行中)Xcode生成的-lcurl显式为“/usr/local/lib/libcurl.a”,链接的.app不再显示对libcurl.4的依赖。 dylib。

看起来没有简单的方法可以解决这个问题 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

1 个答案:

答案 0 :(得分:1)

我尝试了SMGreenfield建议的方法,它对我不起作用。其中一个原因是:库不能在通用环境中使用,因为文件 curlbuild.h 对于每个体系结构都是不同的。使用此作为源https://curl.haxx.se/mail/lib-2015-08/0146.html,我做了以下操作。尚未能进行大量测试,但编译时没有错误的库" curl_rule_01声明为负数大小的数组"。

  1. 构建64位静态libcurl:
  2. 将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:
    2. 创建文件夹 / 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:
      2. 创建文件夹 / 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.h curlbuild64.h curlbuild32.h

        1. 打开文件 curlbuild.h 并按如下方式进行编辑:
        2. enter image description here