views:

1178

answers:

3

I'm trying to compile the SQLite amalgamation source into my iPhone app (to give me access to the full-text searching functionality that isn't available in the iPhone-compiled version of the binary.

When I add sqlite3.c and sqlite3.h to a normal Carbon C app template, it compiles just fine (with a single warning about an unused variable), but when I try compiling it in my iPhone project I get a number of errors relating to missing function declarations. I'm able to solve these problems by explicitly including ctype.h, but it's a little strange.

However, even after it builds it fails on linking with the following error:

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

I assume that it's something in the iPhone app's build settings, but I can't figure it out. Any ideas?

A: 

That type of error usually means a missing framework.

  1. Right- or control-click on your Project's Frameworks folder.
  2. Select Add > Existing Framework...
  3. Go to: Macintosh HD > Developer > Platforms > iPhoneOS.platform > Developer > SDKs > iPhoneOS2.2sdk > usr > lib and select libsqlite3.dylib
  4. Rebuild your project

That should take care of it, I think. You may need to add a similar library for running on the iPhone Simulator.

Alex Reynolds
But if I do that, it's going to link against the built-in SQLite library, right? Whereas I want to use my custom compiled one (because it has features that the built-in one doesn't).
John Biesnecker
I don't know that you can do that. I have a feeling Apple won't like it. I could be wrong though
Benny Wong
@bdotdub - you definitely can do it - and why would apple care? it's not like he's trying to replace the system version, just compile in a new version used by his application. it's quite a standard practice.
Jason Coco
+3  A: 

Try it with this steps:

  1. xcode menu -> project -> new target -> static library -> target name: SQLite
  2. drop SQLite amalgamation source into the project, now you can select the target, choose SQLite
  3. xcode menu -> project -> edit active target -> tab General -> Direct Dependencies -> add SQLite
  4. tab General -> Linked Libraries -> add your SQLite
catlan
I ended up doing a variation of this, following the directions here: http://www.clintharris.net/2009/iphone-app-shared-libraries/Worked quite well.
John Biesnecker
+1  A: 

I've managed to do this using the amalgamation and dumped it straight into my project without having to do the linking catlan suggested (I'm not saying it's a bad idea, merely it's possible to do in the main project).

I didn't need to edit anything (except for adding the necessary FTS define for the text searching) and compiled error free. Check your build settings and ensure '-sqlite3' isn't in your Other Linking Flags.

arooaroo