为iPhone应用编译自定义SQLite

11

我试图将SQLite amalgamation源码编译进我的iPhone应用程序中(以便让我可以使用全文搜索功能,该功能在iPhone编译版本的二进制文件中不可用)。

当我将sqlite3.c和sqlite3.h添加到普通的Carbon C应用程序模板中时,它能够成功编译(只有一个关于未使用变量的警告),但是当我尝试在我的iPhone项目中进行编译时,出现了多个与缺少函数声明相关的错误。我可以通过显式地包含ctype.h来解决这些问题,但这有点奇怪。

即使编译成功,它仍会在链接时失败,出现以下错误:

"_sqlite3_version", referenced from:
_sqlite3_version$non_lazy_ptr in sqlite3.0
symbol(s) not found
collect2: ld returned 1 exit status

我认为这是iPhone应用程序构建设置中的某个东西,但我无法想出来。有任何想法吗?


你为什么要使用Carbon C的应用程序模板来部署iPhone? - Jason Coco
我不是。我只是想看看它是否能够在任何地方编译 - 即,是否iPhone项目的设置导致了问题 - 因此,我觉得基本的Carbon C模板最不可能干扰。 - John Biesnecker
(顺便说一句,我是对的,因为它编译得很好) - John Biesnecker
啊,好的,我看错了。我也在iPhone项目中使用sqlite3汇编文件,并且我没有遇到任何编译问题。 - Jason Coco
这就是我在网上找到的所有参考资料都在说的 - 只需放入这两个文件,你就可以开始了。唉... - John Biesnecker
显示剩余3条评论
3个回答

6

按照以下步骤尝试:

  1. 在 Xcode 菜单中选择项目 -> 新建目标 -> 静态库 -> 目标名称:SQLite
  2. 将 SQLite 汇编源代码拖入项目中,现在你可以选择目标,选择 SQLite
  3. 在 Xcode 菜单中选择项目 -> 编辑活动目标 -> 选项卡常规 -> 直接依赖项 -> 添加 SQLite
  4. 选项卡常规 -> 链接的库 -> 添加你的 SQLite

我最终采用了这个方法的一个变种,按照这里的指示进行操作:http://www.clintharris.net/2009/iphone-app-shared-libraries/效果非常好。 - John Biesnecker
1
@makdad,那个链接似乎已经失效了。 - dwlz

1

我已经成功地使用合并方式,并将其直接转储到我的项目中,而无需执行catlan建议的链接操作(我并不是说这是一个坏主意,只是在主项目中可以实现)。

我不需要编辑任何内容(除了添加必要的FTS定义以进行文本搜索),并且编译没有错误。检查您的构建设置,并确保“-sqlite3”不在其他链接标志中。


0

这种类型的错误通常意味着缺少框架。

  1. 右键或控制键单击项目的 Frameworks 文件夹。
  2. 选择 添加 > 现有框架...
  3. 前往:Macintosh HD > Developer > Platforms > iPhoneOS.platform > Developer > SDKs > iPhoneOS2.2sdk > usr > lib 并选择 libsqlite3.dylib
  4. 重新构建您的项目

我想那应该解决了。您可能需要为在 iPhone 模拟器上运行添加类似的库。


但是如果我这样做,它会链接到内置的SQLite库,对吧?而我想使用我自己编译的(因为它具有内置库没有的功能)。 - John Biesnecker
我不知道你能不能这样做。我有一种感觉,苹果不会喜欢它。不过我可能错了。 - Benny Wong
@bdotdub - 你绝对可以做到 - 而且苹果为什么会在意呢?这不像他试图替换系统版本,只是编译一个新版本供他的应用程序使用。这是相当标准的做法。 - Jason Coco
他为什么也想要 iOS 版本的 SQLite 构建呢? - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接