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

C++ 为什么将静态libcurl.a添加到xcode 7.2示例项目将添加libcurl.4.dylib依赖项,c++,xcode,curl,linker,xcode7,C++,Xcode,Curl,Linker,Xcode7,我一直试图通过在Xcode 7.2项目中添加libcurl.a来消除对libcurl.4.dylib的任何依赖。我构建了一个全新的libcurl,并将其放置在/usr/local/lib中(标题位于/usr/local/include/curl中): 但是.app仍然与libcurl.4.dylib相关。找出原因花了好几天时间 虽然我将libcurl.a添加到我的Xcode“linkbinary with Libraries”构建阶段,但Xcode生成的Link命令-lcurl告诉链接器, 默认

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

但是.app仍然与libcurl.4.dylib相关。找出原因花了好几天时间

虽然我将libcurl.a添加到我的Xcode“linkbinary with Libraries”构建阶段,但Xcode生成的Link命令-lcurl告诉链接器, 默认情况下,链接到动态库。链接器将不接受 -static作为-l的前缀,因为CLANG驱动程序不支持 在每个文件的基础上打开/关闭-static/-dynamic(如果链接器确实看到-static,那么它希望所有东西都是静态的——苹果强烈反对这种做法)

一旦我(在一个手动shell链接行中)将Xcode生成的-lcurl显式更改为“/usr/local/lib/libcurl.a”,linked.app就不再显示对libcurl.4.dylib的依赖关系

糟糕的是,似乎没有简单的方法可以做到这一点 除非我用不同的名称复制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不同。利用这一点作为来源,我做了以下工作。尚未能够进行大量测试,但编译的库没有出现错误“curl\u rule\u 01声明为大小为负的数组”

  • 生成64位静态libcurl:
  • 将CURL源文件下载到:/Users/yourname/Libs/

    创建文件夹/Users/yourname/Libs/curl\u 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
    
    $ 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
    
  • 构建32位静态libcurl:
  • 创建文件夹/Users/yourname/Libs/curl\u 32

    输入终端:

    $ 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
    
    $ 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
    
  • 创建通用libcurl:
  • 创建文件夹/Users/yourname/Libs/curl\u 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\u 64复制到/Users/yourname/Libs/curl\u universal,子文件夹lib除外

    在文件夹/Users/yourname/Libs/curl\u universal/include/curl中复制文件curlbuild.h,并另存为curlbuild64.h。将此文件从文件夹/Users/yourname/Libs/curl\u 32/include/curl复制到文件夹/Users/yourname/Libs/curl\u universal/include/curl并将其另存为curlbuild32.h。现在我们应该有三个文件:curlbuild.hcurlbuild64.hcurlbuild32.h

  • 打开文件curlbuild.h并按如下方式编辑:

  • 你好。您是如何使用静态libcurl在Xcode中编译项目的?我按照您的指示构建了这个库,在其他链接器标志中包含了
    /usr/local/lib/libcurl.a
    。我得到87个未定义的符号错误。谢谢大家!@IgorTupitsyn——我必须再看看我做了什么:我在我的主文件夹(即~/lib)中创建了一个lib文件夹,然后把它放在libcurl-x86_64.a中。“诀窍”是在Xcode构建设置“库搜索路径”中,将“/Users/stephen/lib”放在“/usr/local/lib”之前。谢谢!它现在似乎起作用了。除了libcurl.a库不是通用的——当我试图用32位体系结构编译时,它会给我错误。我试图用CFLAGS=“-arch i386”创建另一个副本,但没有成功。。。干杯。@IgorTupitsyn-我想对于CFLAGS和LDFLAGS,您可能需要将i386和x86_64作为-arch的参数。(见我对我的问题的编辑,上面)这真的很有趣。它不允许我同时编译32位和64位。根本不编译。只有当我为32位或64位单独编译时。。。还是非常感谢你的帮助!我也有同样的问题,这个解决方案有效:)谢谢