将使用Clang构build的库链接错误添加到使用GCC构build的iOS应用程序中

我正在尝试将Dropbox Sync API(v1.1.2)添加到使用Marmalade(v6.3)构build的iOS应用程序中。 我收到以下链接错误:

Undefined symbols for architecture armv7: "___udivmodsi4", referenced from: _sqlite3BitvecSet in libDropbox.a(sqlite3.o) _sqlite3BitvecClear in libDropbox.a(sqlite3.o) _sqlite3BitvecTest in libDropbox.a(sqlite3.o) ld: symbol(s) not found for architecture armv7 

使用Google错误信息的相关部分search发现,某个SQLCipher库的许多用户遇到同样的问题,并且build议由于用于构build该库的编译器以及使用该库的各种项目的不一致而导致该问题。

由于我们的项目的构build系统是由Marmalade工具集build立的,所以我认为改变编译器(我相信现在是Marmalade提供的GCC 4.4的一个版本)是不可行的。

谁能告诉我更确切的是哪里出了问题? 这个问题还有其他的解决方法吗?

另一个答案是正确的。 但是,对于这个特定的问题(如果这些是唯一的链接器错误),我看到两个解决方法:

  1. 从包含sqlite3BitvecSet sqlite3中sqlite3BitvecSet源代码,并在自己的项目中编译这些函数以覆盖该库。 他们会select你自己的编译器提供的任何divmod支持。
  2. 实现你自己的udivmodsi4 。 您不必实现按位分隔(尽pipe您可以从GCC源代码获取基本的C实现)。 你只需要在本地操作中实现它,让你的编译器调用它需要的任何内部支持。

这是未经testing的,但应该给你的基本想法。 您可能需要更多的下划线来匹配其他构build环境的行为/命名:

 unsigned long udivmodsi4(unsigned long num, unsigned long den, int modwanted) { if (modwanted) return num % den; else return num / den; } 

在ARM等处理器上,相对简单的指令集,一些更复杂的操作被映射到函数调用,而不是指令序列。 当你使用“正确的”编译器进行链接时,它们的实现就会被引入并且工作起来! 你通常不会看到它。

这里明显的解决scheme是使用marmalade编译dropbox库,然后使用兼容的编译器。

那么,我想呢,问题是,是否有一个原因,你不这样做呢? 目前的Marmalade编译器不支持ARC。 我想这将是不在ARC下编译的原因。