Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS上使用curl,我无法链接到多个体系结构,CurlchkszEQ宏失败_Ios_Xcode_Curl - Fatal编程技术网

在iOS上使用curl,我无法链接到多个体系结构,CurlchkszEQ宏失败

在iOS上使用curl,我无法链接到多个体系结构,CurlchkszEQ宏失败,ios,xcode,curl,Ios,Xcode,Curl,我使用在GitHub上找到的精彩的“build_curl”脚本构建了许多版本的curl。我还使用其他技术重建了curl 但我总是以同样的问题结束 我有一个iOS项目,它链接到curl。我可以在模拟器上构建和调试(显然是使用i386)。我可以使用设备构建和调试,只要我选择只构建当前体系结构,并且在构建时插入设备 但是,如果我选择尝试构建发行版,或者如果我选择为没有插入设备的“iOS设备”构建调试。我总是会出现以下错误: curlrules.h:143:6: '__curl_rule_01__' d

我使用在GitHub上找到的精彩的“build_curl”脚本构建了许多版本的curl。我还使用其他技术重建了curl

但我总是以同样的问题结束

我有一个iOS项目,它链接到curl。我可以在模拟器上构建和调试(显然是使用i386)。我可以使用设备构建和调试,只要我选择只构建当前体系结构,并且在构建时插入设备

但是,如果我选择尝试构建发行版,或者如果我选择为没有插入设备的“iOS设备”构建调试。我总是会出现以下错误:

curlrules.h:143:6: '__curl_rule_01__' declared as an array with a negative size
这是由以下原因造成的:

#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1
typedef char
  __curl_rule_01__
    [CurlchkszEQ(long, CURL_SIZEOF_LONG)];
这个定义存在于curlpuild.h中

#define CURL_SIZEOF_LONG 4
这应该是正确的,因为我正在构建一个32位的体系结构,然而,Xcode决定
sizeof(long)!=4
,因此宏生成错误

我选择只为armv7和armv7s构建,但仍然会遇到这个错误

我不明白这为什么不能建立

我选择只为armv7和armv7s构建,但仍然会遇到这个错误

您是否查看了Xcode构建日志以确认只有
-arch-armv7
-arch-armv7
用于编译

您的问题当然与这样一个事实有关:即使您试图构建一个结合了armv7/v7s和arm64体系结构的fat可执行文件,您仍然使用一组头文件(例如为库的32位构建生成的头文件)

我想你应该参考一下。正如您所看到的,随附的
curlbuild.h
标题包含特殊宏,用于区分ILP32和LP64:

/* The size of `long', as computed by sizeof. */
#ifdef __LP64__
#define CURL_SIZEOF_LONG 8
#else
#define CURL_SIZEOF_LONG 4
#endif
请注意,Nick页面上的说明没有包含关于如何生成此标头的任何精确信息-我想说,它已被专门修改为跨平台兼容

更新

上面的链接已关闭(您可以在上找到快照-最新的预构建是从2015-01-08为libcurl 7.40.0制作的)。我复制了
build libcurl ios.sh
curlbuild.h
(为
iOScURL
应用程序制作的一个方便的标题)

armv7
生成
build libcurl ios.sh
之后,生成生成的32位头的副本:

cp include/curl/curlbuild.h ~/Desktop/curlbuild32.h
arm64
build之后也会发生同样的事情:

cp include/curl/curlbuild.h ~/Desktop/curlbuild64.h
最终的
curlbuild.h
只不过是一个方便的版本,由于
\ifdef\uuuu LP64\uu/*…*/#else/*…*/#endif
节。特别是,存在的差异不仅仅是
CURL\u SIZEOF\u LONG
,例如:

#define CURL_TYPEOF_CURL_OFF_T int64_t /* 64-bit */
#define CURL_TYPEOF_CURL_OFF_T long    /* 32-bit */

我不想讨论32位和64位头之间的每一个差异,而是这样做了:

  • 使用以下脚本生成32位和64位libcurl版本,包括头文件:
  • 将标题放入
    include-32
    include-64
    目录中
  • 将标题搜索路径设置为在步骤2中创建的目录上方包含一个目录
  • 创建了名为
    my_curl.h
    的头文件,如下所示:

    #ifdef __LP64__
    #include <include-64/curl/curl.h>
    #else
    #include <include-32/curl/curl.h>
    #endif
    
    \ifdef\uu LP64__
    #包括
    #否则
    #包括
    #恩迪夫
    

  • 也许不是最优雅的解决方案,但它节省了我手工操作的时间(和出错的风险)。

    通过以上对curlbuild.h头文件的修改,使用Xcode 5.1,我现在可以在iOS上构建所有体系结构。它没有解释为什么以前版本的Xcode是为arm64构建的,而我在设置中明确排除了这一点,但由于所有体系结构现在都构建并工作了,我可以继续…嘿@arrtchiu我想尝试一下你的方法,但是你发布的链接断了。你知道我在哪里可以找到你使用的脚本吗?很抱歉延迟回复。我最终停止使用这种方法,转而使用一种更为集成的解决方案,名为hunter(),它负责处理这个问题。