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

How*_*ere 9 xcode curl ios

我使用我在GitHub上找到的精彩"build_curl"脚本构建了许多版本的curl.我还使用其他技术重建卷曲.

但我总是遇到同样的问题.

我有一个与curl链接的iOS项目.我可以在模拟器上构建和调试(显然使用i386).只要我选择构建当前架构并且在构建时插入设备,我就可以使用设备进行构建和调试.

但是,如果我选择尝试构建Release OR,如果我选择为没有插入设备的'iOS Device'构建Debug.我总是会遇到以下错误:

curlrules.h:143:6: '__curl_rule_01__' declared as an array with a negative size
Run Code Online (Sandbox Code Playgroud)

这是由于:

#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1
typedef char
  __curl_rule_01__
    [CurlchkszEQ(long, CURL_SIZEOF_LONG)];
Run Code Online (Sandbox Code Playgroud)

这个#define存在于curlbuild.h中

#define CURL_SIZEOF_LONG 4
Run Code Online (Sandbox Code Playgroud)

哪个应该是正确的,因为我正在为32位架构构建,但是,Xcode决定了这一点sizeof(long) != 4,因此宏会产生错误.

我选择只为armv7和armv7s构建,但我仍然遇到此错误.

我不明白为什么这不会建立.

del*_*eil 7

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

你看Xcode的构建日志,确认只有-arch armv7-arch armv7s用于编译?

你的问题肯定与你使用一组头文件(例如为库的32位版本生成)有关,即使你试图构建一个结合了armv7/v7s和arm64架构的胖可执行文件.

我想你应该参考预建的Nick Zitzmann libcurl.正如您所看到的curlbuild.h,随附的标头包含用于区分ILP32和LP64的ad-hoc宏:

/* The size of `long', as computed by sizeof. */
#ifdef __LP64__
#define CURL_SIZEOF_LONG 8
#else
#define CURL_SIZEOF_LONG 4
#endif
Run Code Online (Sandbox Code Playgroud)

请注意,Nick页面上的说明不包含有关如何生成此标头的任何精确度 - 我会说它已经过专门修改以符合跨平台的要求.

UPDATE

上面的链接已关闭(可以在Internet Archive上找到快照- 最新的预构建版本是从2015-01-08开始的libcurl 7.40.0).我做了一个副本(逐字)build-libcurl-ios.shcurlbuild.h(用于制作单,头方便iOScURL应用程序)在这里.

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

cp include/curl/curlbuild.h ~/Desktop/curlbuild32.h
Run Code Online (Sandbox Code Playgroud)

arm64构建后同样的事情:

cp include/curl/curlbuild.h ~/Desktop/curlbuild64.h
Run Code Online (Sandbox Code Playgroud)

最后curlbuild.h只是一个方便的版本,包括32位和64位细节,这要归功于#ifdef __LP64__ /* ... */ #else /* ... */ #endif各个部分.特别是不仅有CURL_SIZEOF_LONG差异,例如:

#define CURL_TYPEOF_CURL_OFF_T int64_t /* 64-bit */
#define CURL_TYPEOF_CURL_OFF_T long    /* 32-bit */
Run Code Online (Sandbox Code Playgroud)