链接错误添加铿锵内置于iOS应用库GCC建(Link error adding library bu

2019-10-18 15:18发布

我想Dropbox的同步API(V1.1.2)加入果酱(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库的用户遇到同样的问题,并建议该问题是由用于构建库,并使用它的各种项目的编译器的不一致而产生的。

至于我们的项目的构建系统成立了由果酱工具集,更改编译器(目前由果酱提供GCC 4.4版本,我相信)是不是一种选择,我想。

谁能告诉我更准确地说什么错误? 是否有任何其他方法可以解决该问题?

Answer 1:

对方的回答是正确的。 然而,对于这一特定问题(如果这些是你所得到的只是链接器错误),我看到两种解决方法:

  1. 抓住从sqlite3的,包括源sqlite3BitvecSet并在自己的项目来覆盖库编译这些功能。 他们将拿起任何divmod支持是由你自己的编译器提供。
  2. 实现自己的udivmodsi4 。 你不必实行按位师(虽然你可以得到海合会来源,基本的C实现)。 你只需要实现它在本地操作,让你的编译器调用任何内部支持需要。

这是未经测试,但应该给你的基本理念。 您可能需要在名称更下划线来匹配其他构建环境的行为/命名:

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


Answer 2:

像ARM处理器,具有相对简单的指令集,一些更复杂的操作映射到函数调用指令,而序列。 当您链接使用“正确”的编译器,这些的实现都是拉到和它的作品! 你通常on't看到它。

这里明显的解决办法是使用果酱编译保管箱库,那么它将使用兼容的编译器。

接下来的问题,我想,是,是否有你不这样做是为了启动一个原因吗? 当前果酱编译器不支持ARC。 我想这将是一个理由不ARC下编译。



文章来源: Link error adding library built with Clang to iOS app built with GCC