我使用在 GitHub 上找到的精彩“build_curl”脚本构建了许多版本的 curl。我还使用其他技术重建了 curl。
但我总是遇到同样的问题。
我有一个链接到 curl 的 iOS 项目。我可以在模拟器上构建和调试(显然使用 i386)。只要我选择仅构建当前架构并且在构建时插入设备,我就可以使用设备进行构建和调试。
但是,如果我选择尝试构建 Release 或者如果我选择在没有插入设备的情况下为“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)];
这个#define存在于curlbuild.h中
#define CURL_SIZEOF_LONG 4
这应该是正确的,因为我正在为 32 位架构构建,然而,Xcode 已决定 sizeof(long) != 4
,因此宏会生成错误。
我已选择只为 armv7 和 armv7s 构建,但我仍然收到此错误。
我不明白为什么这不会构建。
最佳答案
I have chosen to only build for armv7 and armv7s, and still i get this error.
您是否查看了 Xcode 构建日志以确认只有 -arch armv7
和 -arch armv7s
用于编译?
您的问题肯定与您使用一组 header (例如为库的 32 位构建生成)这一事实有关,即使您尝试构建结合了 armv7/v7s 和 arm64 架构的胖可执行文件。
我想你应该引用Nick Zitzmann libcurl pre-built .如您所见curlbuild.h
附带的 header 包括用于区分 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 页面上的说明不包括有关如何生成此 header 的任何精确信息 - 我会说它已被专门修改为跨平台兼容。
更新
以上链接已关闭(可以在 Internet Archive 上找到快照 - 最新的预构建是从 2015 年 1 月 8 日开始为 libcurl 7.40.0 制作的)。我复制了一份(逐字)build-libcurl-ios.sh
和 curlbuild.h
(为 iOScURL
应用程序制作的单一、方便的标题)here .
armv7
之后构建 build-libcurl-ios.sh
复制生成的 32 位 header :
cp include/curl/curlbuild.h ~/Desktop/curlbuild32.h
在 arm64
之后同样的事情构建:
cp include/curl/curlbuild.h ~/Desktop/curlbuild64.h
决赛curlbuild.h
由于#ifdef __LP64__ /* ... */ #else /* ... */ #endif
,它只不过是一个包含 32 位和 64 位细节的方便版本部分。特别是不止有 CURL_SIZEOF_LONG
差异,例如:
#define CURL_TYPEOF_CURL_OFF_T int64_t /* 64-bit */
#define CURL_TYPEOF_CURL_OFF_T long /* 32-bit */
关于ios - 在 iOS 上使用 curl,我无法链接多个架构,CurlchkszEQ 宏失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681954/