我正在尝试将Dropbox Sync API(v1.1.2)添加到使用Marmalade(v6.3)构建的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
搜索该错误消息的相关部分会发现某个SQLCipher库的许多用户遇到同样的问题,并建议该问题是由用于构建该库的编译器和使用它的各个项目的不一致引起的
由于我们项目的构建系统是由Marmalade工具集设置的,我认为更改编译器(目前是Marmalade提供的GCC 4.4版本,我相信)不是一种选择。
谁能更准确地告诉我出了什么问题?这个问题还有其他解决方法吗?
答案 0 :(得分:2)
在像ARM这样的处理器上,使用相对简单的指令集,一些更复杂的操作被映射到函数调用而不是指令序列。当你使用“正确的”编译器链接时,这些的实现被拉入并且它可以工作!你通常不会看到它。
这里显而易见的解决方案是使用橘子酱编译dropbox库,然后使用兼容的编译器。
我想,问题是,你是否有理由不这样做?目前的Marmalade编译器不支持ARC。我想这不是在ARC下编译的原因。
答案 1 :(得分:1)
另一个答案是正确的。但是,对于这个特定问题(如果这些是你得到的唯一链接器错误),我看到两个解决方法:
sqlite3BitvecSet
的sqlite3中获取源代码,并在您自己的项目中编译这些函数以覆盖该库。他们将获取您自己的编译器提供的任何divmod支持。udivmodsi4
。您不必实现按位除法(尽管您可以从GCC源获得该基本C实现)。您只需在本机操作中实现它,并让您的编译器调用它所需的任何内部支持。这是未经测试的,但应该给你基本的想法。您可能需要在名称上添加更多下划线以匹配其他构建环境的行为/命名:
unsigned long
udivmodsi4(unsigned long num, unsigned long den, int modwanted)
{
if (modwanted)
return num % den;
else
return num / den;
}