libsqlite3.dylib,缺少所需的i386架构。

4
我正在使用libsqlite3.dylib,在编译我的项目时遇到以下错误。
ld: warning: ignoring file /Users/dcdmc/Documents/Beginning iPhone 5 Dev/Persistence copy/libsqlite3.dylib, 
             missing required architecture i386 in file
Undefined symbols for architecture i386:

"_sqlite3_open", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o
  -[OJViewController applicationWillResignActive:] in OJViewController.o

"_sqlite3_close", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o
  -[OJViewController applicationWillResignActive:] in OJViewController.o

"_sqlite3_exec", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o

"_sqlite3_prepare_v2", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o
  -[OJViewController applicationWillResignActive:] in OJViewController.o

"_sqlite3_step", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o
  -[OJViewController applicationWillResignActive:] in OJViewController.o

"_sqlite3_column_int", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o

"_sqlite3_column_text", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o

"_sqlite3_finalize", referenced from:
  -[OJViewController viewDidLoad] in OJViewController.o
  -[OJViewController applicationWillResignActive:] in OJViewController.o

"_sqlite3_bind_int", referenced from:
  -[OJViewController applicationWillResignActive:] in OJViewController.o

"_sqlite3_bind_text", referenced from:
  -[OJViewController applicationWillResignActive:] in OJViewController.o

ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
4个回答

10

首先,备份并检查是否已将此框架物理复制到您项目文件夹的根目录中。如果您在那里找到了它,只需从那里删除它,然后重新构建即可。希望这有所帮助。


1

你的目标是模拟器吗?

问题在于:

  1. 编译iOS模拟器时,架构为i386
  2. 编译iOS设备时,架构为armv6 / armv7

您的项目包含一个不包含i386代码的动态库。

由于该库是SQLite,我的建议是不要将其作为动态库包含;而是直接在您的项目中包含源代码(只有2个文件:sqlite.c和sqlite.h)。 您可以从http://www.sqlite.org下载sqlite的源代码。


动态库是一件好事,特别是在资源有限的嵌入式平台上。iOS甚至为了效率而映射了所有dylib文件。当dylibs可用时,人们不应该将源代码编译到他们的项目中(除了极端情况,这个家伙似乎不在其中)。如果他/她将源代码复制到他们的项目中,那么他们在未来的iOS版本中就无法获得sqlite的改进,除非他们继续手动下载新代码。大多数项目都不希望这样。在这种情况下,这个人显然只是搞砸了框架链接。他们应该修复它。 - Nate
谢谢!这行代码很有帮助:“在编译iOS模拟器时,架构是i386”。 - ArturOlszak

0

在一个类中使用SQLite操作之前,请包含此内容

#include <sqlite3.h>

我已经包含了<sqlite3.h>,但仍然出现错误。 - Amrita
当您添加项目目标文件libsqlite3.dylib框架时。 - Senthilkumar
1
我所使用的libsqlite3.dylib编译为armv6而非7,因此您需要添加libsqlite3.0.dylib。 - Senthilkumar

0

我对iOS开发非常新手,但我正在阅读Apress的书籍“Beginning iOS 6 Development”,在第13章中遇到了一个非常相似的问题。我不得不使用Text mate打开(YourProjectName).xcodeproj文件中的project.pbxproj文件并删除“LIBRARY_SEARCH_PATHS”。有两个不同的行,一个是调试构建设置,另一个是发布构建设置。我希望这对某些人有所帮助。


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