1. 程式人生 > >嵌入式資料庫Sqlite移植教程-轉

嵌入式資料庫Sqlite移植教程-轉

嵌入式資料庫Sqlite移植教程

sqlite-3.3.6編譯安裝與交叉編譯全過程詳細記錄

本文介紹的內容都是基於 Linux RedHat 9.0 平臺的。
一、PC機編譯安裝
請閱讀在安裝包裡的 INSTALL 檔案。或者使用PEAR installer with "pear install sqlite"。SQLite已經內建了,你不需要安裝任何附加的軟體(additional software)。
Windows users可以下載SQLite擴充套件DLL(php_sqlite.dl)。
這裡簡單介紹一下:
假設你得到的是原始碼sqlite-3.3.6.tar.gz,這裡將告訴你怎麼編譯它。
解壓sqlite-3.3.6.tar.gz 到 /home目錄下
For example:
tar zxvf sqlite-3.3.6.tar.gz -C /home            
cd /home
mkdir sqlite-ix86-linux
cd /home/sqlite-ix86-linux/
../sqlite-3.3.6/configure --prefix=/home/sqlite-ix86-linux/
編譯並安裝,然後生成幫助文件
make && make install && make doc
如果出現下列錯誤
../sqlite-3.3.6/src/tclsqlite.c: In function `DbUpdateHandler'''''''':
../sqlite-3.3.6/src/tclsqlite.c:333: warning: passing arg 3 of `Tcl_ListObjAppendElement'''''''' makes pointer from integer without a cast
../sqlite-3.3.6/src/tclsqlite.c: In function `tclSqlFunc'''''''':
../sqlite-3.3.6/src/tclsqlite.c:419: warning: passing arg 1 of `Tcl_NewByteArrayObj'''''''' discards qualifiers from pointer target type
這個都是tcl相關的錯誤,可以先安裝ActiveTcl以解決.假如你不需要tcl支援,那麼這個錯誤可以這樣避免:
cd /home/sqlite-ix86-linux/
    ../sqlite-3.3.6/configure --disable-tcl --prefix=/home/sqlite-ix86-linux/
編譯並安裝,然後生成幫助文件 
make && make install && make doc
不出意外,將不會出現錯誤,那麼
庫檔案已經生成在 /home/sqlite-ix86-linux/lib 目錄下 
可執行檔案sqlite3已經生成在 /home/sqlite-ix86-linux/bin 目錄下 
下面建立一個新的資料庫檔名叫"zieckey.db" (當然你可以使用不同的名字) 來測試資料庫.
直接輸入: /home/sqlite-ix86-linux/bin/sqlite3 test.db
如果出現下面字樣表明編譯安裝已經成功了.
SQLite version 3.3.6
Enter ".help" for instructions
sqlite>

二、交叉編譯sqlite.3.3.6.tar.gz庫檔案
tar zxvf sqlite-3.3.6.tar.gz -C /home     (這一步前面已經有了,為了完整性,這裡還是寫出來)
mkdir /home/sqlite-arm-linux
設定交叉編譯環境
export PATH=/usr/local/arm-linux/bin:$PATH
cd /home/sqlite-arm-linux/
../sqlite-3.3.6/configure --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux
這步出現錯誤而沒有生成Makefile
configure: error: unable to find a compiler for building build tools
前面檢查arm-linux-gcc都通過了,怎麼還說沒有找到編譯器呢?花了點時間看configure的指令碼,太複雜了,又結合configure.ac看了一下。原來是要設定config_TARGET_CC和config_BUILD_CC兩個環境變數。config_TARGET_CC是交叉編譯器,config_BUILD_CC是主機編譯器。重來:
export config_BUILD_CC=gcc
export config_TARGET_CC=arm-linux-gcc
../sqlite-3.3.6/configure --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux
又出現如下錯誤
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling
說readline.h的錯,找到readline.h在/usr/include/readline/readline.h目錄,我想這樣解決
ln -s /usr/include/readline/readline.h /usr/include/readline.h
但還是不行
../sqlite-3.3.6/configure --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux
還是出現如下同樣的錯誤
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling
上面說是要檢查交叉編譯環境,我可以肯定我的交叉編譯環境是正確的,
所以我決定欺騙configure,我是這樣做的
cd /home/sqlite-3.3.6
將該目錄下的 configure 檔案的部分內容修改下(這裡是根據   test "$cross_compiling" = yes && 找到的 ),
這樣可以讓configure不去檢查你的交叉編譯環境。
20420行 { (exit 1); exit 1; }; }改為 { (echo 1); echo 1; }; }
20446行 { (exit 1); exit 1; }; }改為 { (echo 1); echo 1; }; }
在回去重新配置下:
cd /home/sqlite-arm-linux/
../sqlite-3.3.6/configure --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux
中間列印資訊出現如下錯誤資訊,
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling
但是還是生成了Makefile檔案一個libtool指令碼,這些將在make時用到. 
注意:
如果Makefile檔案中有如下語句
BCC = arm-linux-gcc -g -O2 
請將其改掉,改成:
BCC = gcc -g -O2

將下面的這行

sqlite3$(TEXT):$(TOP)/src/shell.c libsqlite3.la sqlite3.h

改成

sqlite3$(TEXT):$(TOP)/src/shell.c .libs/libsqlite3.a sqlite3.h

因為執行時都是將SQlite放到Arm-linux的硬體板子上執行,所以一般將其編譯成靜態連結的形式。
編譯並安裝
make && make install 
這裡如果不出意外,將不會出現錯誤,那麼庫檔案已經生成在 /home/sqlite-ix86-linux/lib 目錄下 好了,就到這裡。


sqlite-3.3.17交叉編譯說明
1、在Redhat Linux9上用arm-linux-gcc編譯成功sqlite-3.3.17靜態庫版本。
2、在Redhat Linux9上用arm-linux-gcc編譯成功sqlite-3.3.17動態庫版本。
3、在Redhat Linux9上用arm-linux-gcc編譯成功基於sqlite3靜態庫的應用程式。
4、在Redhat Linux9上用arm-linux-gcc編譯成功基於sqlite3動態庫的應用程式。
//==================================================================
//Compile SQLite using the cross-compiler such as arm-linux-gcc

1. first, get sqlite-3.3.17.tar.gz from www.sqlite.org

2. unzip it
   #tar -zxvf sqlite-3.3.17.tar.gz
3. change into the sqlite-3.3.17 directory
   cd sqlite-3.3.17
4. make a new directory such as ''''''''build'''''''' under sqlite-3.3.17 directory,
   mkdir sqlite-arm-linux
5. First,Please ensure the cross compiler arm-linux-gcc included in PATH,
   Use ''''''''echo $PATH'''''''',you can look out the PATH,
   if no,Set the path:
   export PATH=/usr/local/arm/2.95.3/bin:$PATH
6. 3.3.17版本的configure和Makefile都不需改動
7. change into the build directory you created 
   cd sqlite-arm-linux
8. call the edited configure script from the sqlite directory by using the following option:
../configure --disable-tcl --host=arm-linux
9. After that configure should have created a Makefile and a libtool script in your build directory.
10. run ''''''''make'''''''' command to create the sqlite3 execute file, after a successful compile

11. Now you should find a hiden “.libs” directory in your build directory containing sqlite shared object files, 
   like libsqlite3.so or static libray files like libsqlite3.a .

12. use ''''''''file sqlite3'''''''' to look the inf of sqlite3, run ''''''''arm-linux-strip sqlite3'''''''' to decrease the execute file size.
13. upload the sqlite3 to target ARM9 board by any FTP client and make it executive:
14. on ARM9 board with terminal or telnet ,run 
   chmod 775 sqlite3
15. and then run sqlite3 like this
   sqlite3 ex2

16. ,if you see the following messages:
   SQLite version 3.3.17
    Enter ".help" for instructions
sqlite>


在ARM-Linux平臺上移植SQLite
1、軟硬體平臺
本文中採用的硬體平臺為Sitsang嵌入式評估板。Sitsang評估板的核心是PXA255嵌入式處理器。底層軟體系統是以ARM-Linux核心為基礎的。
要將SQLite3移植到Sitsang評估板上,除了要有底層作業系統的支援外,還必須要有相應的交叉編譯工具鏈。由於Sitsang評估板採用的是ARM-Linux作為底層作業系統,因此需要首先安裝ARM-Linux工具鏈。關於ARM-Linux工具鏈的安裝可以參閱文獻[4]。ARM-Linux工具鏈通常安裝在/usr/local/arm-linux/bin/目錄下,通常以arm-linux-開頭。本文中將會涉及到的主要是arm-linux-gcc、arm-linux-ar、arm-linux-ranlib這樣三個工具。
2、移植過程
首先從http://sqlite.org下載SQLite 3.4.2。本文中假設將sqlite-3.4.2.tar.gz下載到/home/liyan/sqlite目錄下。然後,通過下列命令解壓縮sqlite-3.4.2.tar.gz並將檔案和目錄從歸檔檔案中抽取出來:
# tar zxvf sqlite-3.4.2.tar.gz
解壓抽取完成之後將會在/home/liyan/sqlite目錄下生成一個sqlite-3.4.2/子目錄,在該目錄中包含了編譯所需要的所有原始檔和配置指令碼。SQLite3的所有原始碼檔案都位於sqlite-3.4.2/src/目錄下。
和在PC環境下編譯SQLite3不同,不能通過sqlite-3.4.2/目錄下的configure指令碼來生成Makefile檔案。取而代之的是必須手動修改Makefile檔案。在sqlite-3.4.2/目錄下有一個Makefile範例檔案Makefile.linux-gcc。首先通過下面的命令拷貝此檔案並重命名為Makefile:
# cp Makefile.linux-gcc Makefile
接下來,用vim開啟Makefile檔案並手動修改Makefile檔案的內容。首先找到Makefile檔案中的下面這樣一行:
TOP = ../sqlite 將其修改為:TOP = .
找到下面這樣一行:TCC = gcc -O6 將其修改為:TCC = arm-linux-gcc -O6
找到下面這樣一行:AR = ar cr 將其修改為:AR = arm-linux-ar cr
找到下面這樣一行:RANLIB = ranlib將其修改為:RANLIB = arm-linux-ranlib
找到下面這樣一行:MKSHLIB = gcc -shared 將其修改為:MKSHLIB = arm-linux-gcc -shared
註釋掉下面這一行:TCL_FLAGS = -I/home/drh/tcltk/8.4linux
註釋掉下面這一行:LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
vi中的查詢方法:在命令模式下輸入“?”加要查詢的字串,再回車。輸入“n”為查詢下一處。
原則上,對Makefile的修改主要包括兩個方面:首先是將編譯器、歸檔工具等換成交叉工具鏈中的對應工具,比如,gcc換成arm-linux-gcc,ar換成ar-linux-ar,ranlib換成arm-linux-ranlib等等;其次是去掉與TCL相關的編譯選項,因為預設情況下,將會編譯SQLite3的Tcl語言繫結,但是在移植到ARM-Linux的時候並不需要,因此將兩個與TCL有關的行註釋掉。
接下來,還需要修改的一個的檔案是main.mk,因為Makefile包含了這個檔案。找到這個檔案中的下面一行:select.o table.o tclsqlite.o tokenize.o trigger.o把它替換成:select.o table.o tokenize.o trigger.o
也就是把該行上的tclsqlite.o去掉。這樣編譯的時候將不會編譯SQLite3的Tcl語言繫結。
自此,修改工作就完成了,接下來就可以開始編譯SQLite3了,這通過make命令即可完成:
# make
編譯完成之後,將在sqlite3.4.2/目錄下生成庫函式檔案libsqlite3.a和標頭檔案sqlite3.h,這就是所需要的兩個檔案了。
3、測試
這裡以SQLite官方站點http://sqlite.org的quick start文件中的測試程式為例對移植到ARM-Linux上的SQLite3進行測試。該程式清單如下:

#include

#include

static int callback(void *NotUsed, int argc, char **argv, char **azColName)

{

int i;

for(i=0; i

{

    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");

}

printf("\n");

return 0;

}

int main(int argc, char **argv)

{

sqlite3 *db;

char *zErrMsg = 0;

int rc;

if( argc!=3 )

{

    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);

    exit(1);

}

rc = sqlite3_open(argv[1], &db);

if( rc )

{

    fprintf(stderr, "Can''''''''t open database: %s\n",sqlite3_errmsg(db));

    sqlite3_close(db);

    exit(1);

}

rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);

if( rc!=SQLITE_OK )

{

    fprintf(stderr, "SQL error: %s\n", zErrMsg);

    sqlite3_free(zErrMsg);

}

sqlite3_close(db);

return 0;

}

將此源程式儲存為test.c,然後,通過如下命令編譯該程式:

# arm-linux-gcc -I /home/liyan/sqlite/sqlite-3.4.2 -L /home/liyan/sqlite/sqlite-3.4.2 -o test test.c -lsqlite3

注意:可能會出現以下錯誤

/home/liyan/sqlite/sqlite-3.4.2/libsqlite3.a(os_unix.o)(.text+0x3ec): In function `sqlite3UnixDlopen'''''''':

: undefined reference to `dlopen''''''''

/home/liyan/sqlite/sqlite-3.4.2/libsqlite3.a(os_unix.o)(.text+0x3f4): In function `sqlite3UnixDlsym'''''''':

: undefined reference to `dlsym''''''''

/home/liyan/sqlite/sqlite-3.4.2/libsqlite3.a(os_unix.o)(.text+0x3f8): In function `sqlite3UnixDlclose'''''''':

: undefined reference to `dlclose''''''''

collect2: ld returned 1 exit status

解決方法:在編譯命令後加 “-ldl”

# arm-linux-gcc -I /home/liyan/sqlite/sqlite-3.4.2 -L /home/liyan/sqlite/sqlite-3.4.2 -o test test.c -lsqlite3 -ldl

上述編譯命令中:

-I /home/liyan/sqlite/sqlite-3.4.2指明瞭標頭檔案sqlite3.h所在的目錄;

-L /home/liyan/sqlite/sqlite-3.4.2指定了庫函式檔案libsqlite3.a所在的目錄;

-o test指定編譯生成的檔名為test,test.c是源程式檔案;

-lsqlite3指明要連結靜態庫檔案libsqlite3.a。

編譯完成後,可以通過NFS將test下載到Sitsang評估板上,通過ls命令可以看到test的大小隻有300K左右:

[[email protected] sqlite]# ls -l test

-rwxr-xr-x 1 root root 359148 09-03 13:22 test

接下來就可以測試test程式了。test程式接受兩個引數:第一個引數為資料庫檔名,第二個引數為要執行的SQL語句。程式中與SQLite3的API相關的地方主要有四個:sqlite3_open(), sqlite3_exec(), sqlite3_close(), sqlite3_free()。關於SQLite3的API介面請參閱文獻[1]。

下面是測試test程式的完整過程,(在板子上):

/var/tmp/ly # ./test xyz.db "create table tbl0(name varchar(10), number smallint);"

/var/tmp/ly # ./test xyz.db "insert into tbl0 values(''''''''cyc'''''''', 1);"

/var/tmp/ly # ./test xyz.db "insert into tbl0 values(''''''''dzy'''''''', 2);"

/var/tmp/ly # ./test xyz.db "select * from tbl0;"

name = cyc

number = 1

name = dzy

number = 2

解釋一下上面所用的測試命令:

第一條命令在xyz.db這個資料庫檔案中建立了一個tbl0表,表中包含兩個欄位,欄位name是一個變長字串,欄位number的型別為smallint;

第二條命令向資料庫的tbl0表中插入了一條記錄(‘cyc’,1);

第三條命令向資料庫的tbl0表中插入了一條記錄(‘dzy’,2);

第四條命令則是查詢表tbl0中的所有內容,與預期的一樣,這條命令列印除了資料庫中的兩條剛插入的記錄。

由此可以得出結論,這幾條命令確實都已經按照預期的目標工作了。

同時,在向資料庫中插入上面所示的資料之後,可以看到資料庫檔案xyz.db大小已經發生了變化:

/var/tmp/ly # ls -l test

-rw-r--r-- 1 root root 2048 Sep 3 2007 xyz.db

此時資料庫檔案xyz.db的大小為2K。自此,SQLite3資料庫在Sitsang評估板上移植完成。測試結果表明資料庫能夠正常工作。

參考文獻

[1] The Definitive Guide to SQLite。[美]Michael Owens著。Apress,2006

[2] http://sqlite.org

[3] SQLite移植手記。Hily Jiang。www.sqlite.com.cn,2006年11月

[4] Sitsang/PXA255 Evaluation Platform Linux User’s Guide。Intel Ltd,Sep. 2003

*主要參考*[5] 在ARM-Linux平臺上移植SQLite,


sqlite嵌入式資料庫在arm-linux下的編譯全攻略
sqlite嵌入式資料庫在arm-linux下的編譯全攻略 [原創] 2004-06-02 
作者:餘濤(yut616_at_sohu.com)

第一步 sqlite在arm-linux下的編譯 
1、 下載sqlite:請到http://www.sqlite.org/download.html,將下載的程式碼包解開,將生成sqlite目錄,另外新建一個build目錄,如sqlite-arm-linux,應該是和sqlite目錄平行的同級目錄。

2、 請先確定你的PATH中已經包含交叉編譯工具arm-linux-gcc。可用“echo $PATH”命令檢視。如我的是“/opt/toolchain/gcc 3.2/toolchain/bin/”

3、 為了在arm-linux下能正常執行sqlite,我們需要修改一處程式碼,否則在arm板上執行sqlite時會出現下面的東東: 
=============================== 
在檔案btree.c中丟擲斷言, 
assert( sizeof(ptr)==sizeof(char*) ); 
=============================== 
此斷言是為了保證btree(B樹)有正確的變數大小,如“ptr”和“char*”。 在不同的體系結構的linux,如x86和arm,會有些差別。剛好讓我們在arm-linux下遇到了:-)。那麼我們可以做一定的修改。 
請修改sqlite/src/sqliteInt.h,找到如下部分: 
#ifndef INTPTR_TYPE 
# if SQLITE_PTR_SZ==4 
# define INTPTR_TYPE int 
# else 
# define INTPTR_TYPE long long 
# endif 
在上面的程式碼前加上一句: 
#define SQLITE_PTR_SZ 4 
這樣後面的“typedef INTPTR_TYPE ptr;”就是定義的“int”型別,而不是“long long”。

4、 準備使用configure進行一些配置。請在sqlite目錄下的configure中找到如下4處,並將他們註釋掉,這樣可以讓configure不去檢查你的交叉編譯環境。在此提示一下:請你自己確定自己的“arm-linux-”系列命令在你的PATH環境變數中。如:你可以輸入“arm-linux-”再按“TAB”鍵,看其是否自動完成命令列。 
#if test "$cross_compiling" = "yes"; then 
# { { echo "$as_me:12710: error: unable to find a compiler for building build tools" >&5 
#echo "$as_me: error: unable to find a compiler for building build tools" >&2;} 
# { (exit 1); exit 1; }; } 
#fi

. . .

#else 
# test "$cross_compiling" = yes && 
# { { echo "$as_me:13264: error: cannot check for file existence when cross compiling" >&5
#echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} 
# { (exit 1); exit 1; }; }

. . .

#else 
# test "$cross_compiling" = yes && 
# { { echo "$as_me:13464: error: cannot check for file existence when cross compiling" >&5
#echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} 
# { (exit 1); exit 1; }; }

. . .

#else 
# test "$cross_compiling" = yes && 
# { { echo "$as_me:13490: error: cannot check for file existence when cross compiling" >&5
#echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} 
# { (exit 1); exit 1; }; } 
註釋掉後,就可以執行configure了。在sqlite-arm-linux目錄下,輸入如下命令: 
../sqlite/configure --host=arm-linux 
這樣在你的build目錄中就將生成Makefile和一個libtool指令碼,這些將在make時用到。

5、 修改Makefile檔案 
請修改Makefile檔案,將下面的這行 
BCC = arm-linux-gcc -g -O2 
改掉,改成: 
BCC = gcc -g -O2

一般地,我們都是將sqlite放到arm-linux的硬體板子上執行,所以我們一般將其編譯成靜態連結的形式。如果是共享so庫的話,比較麻煩。 
所以繼續修改Makefile,找到如下地方: 
sqlite: 
將有其後的“libsqlite.la”改成 
“.libs/libsqlite.a” 
大功告成,現在可以make了。 
應該不會出錯,生成sqlite,libsqlite.a,libsqlite.so。你可以使用命令:find -name "sqlite";find -name "*.a";find -name "*.so"查

看檔案所在的目錄。 
此時生成的sqlite檔案是還未strip過的,你可以使用命令“file sqlite”檢視檔案資訊。用strip處理過後,將去掉其中的除錯資訊,執行文

件大小也將小很多。命令如下: 
arm-linux-strip sqlite

第二步 在arm板上執行sqlite 
將sqlite拷貝到你的arm板上,方法很多,你需要根據自己的情況來選擇。如ftp,cmdftp,wget等。 
我的方法是使用wget將sqlite下載到arm板的/tmp目錄,此目錄是可寫的。命令如下: 
busybox wget ftp://192.168.0.100/sqlite 
上面的命令,你可以看到我的板子上是已經有busybox來支援wget命令了的。:-) 
好,開始執行 
chmod +wx sqlite 
./sqlite test.sqlite 
會出現 
sqlite> 
提示符號,打個“.help”來看看命令先:-) 
sqlite>.help 
好了。現在sqlite已經在arm-linux下跑了起來。如何,感覺不錯吧,在arm板子上玩玩“select * from”語句蠻爽吧:-)

友情提示: 
如果sqlite在處理資料庫過程中出現“The database disk image is malformed”,如:你在delete from sometable時,可能遇到這個問題。 
那麼就是你的arm板上的空間不夠(如在/tmp下),請刪除掉一些檔案。我遇到的情況是空間還剩1-2M都會出現這個提示。刪除後空餘4M,就正

常了(如delete from sometable)。我是開的8M的ramdisk做開發玩的:-)

謝謝閱讀。 
歡迎轉載,但請寫明出處。

Undefined reference to dlsym
1) I checked out the code to directory called sqlite
2) I modified the Makefile.in <http://makefile.in/> to allow loading
extensions. We have to comment the following line
#TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1
3) Created a directory called build. Ran configure and make from there.
4) I get "undefined refernce to dlsym, dlopen, dlclose" error.

Apparently the problem is with SQLite failing to find dynamic linker
library. I added LDFLAGS to command line before running make
Like this: LDFLAGS=-ldl make. Still it fails.

Please tell me what is the error.


You''''''''ll end up with a Makefile (and several other files) in this directory. Edit this mmakefile and comment out the line:

TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1

I found this to be necessary to avoid errors later when I compile the shell.c (the sqlite3 CLP).

You may also what to edit the line "TLIBS = " to read

TLIBS = -ldl

Now do the following to compile and install:

~/dev/build$ make

After the make you will have a directory full of object files and the sqlite CLP executable called sqlite3

~/dev/build$ sudo make install

New libraries will be installed as /usr/local/lib/libsqlite3.a and /usr/local/lib/libsqlite3.so.0.8.6 (The former being the static lib and the later the shared lib). The sqlite3 executable is also installed in /usr/local/bin/.

Now make the amalgamated sqlite source file:

~/dev/build$ make sqlite3.c

You end up with a very large source file sqlite3.c and the header sqlite3.h which are essentially what you need to embed sqlite in your applications. You also have individual source files under the ~/dev/build/tsrc/. You will also find shell.c here - this is the source used to build the CLP.

To build the CLP using shared library:

~/dev/build$ gcc -O2 -o sqlite3 tsrc/shell.c -ldl -lsqlite3

Note that -lpthread is not required since shell.c does not require it.

You''''''''ll end up with a 39k sqlite3 executable file.

To build the CLP with the sqlite embedded:

~/dev/build$ gcc -O2 -o sqlite3 tsrc/shell.c sqlite3.c -ldl -lpthread

I end up with and executable of just under 380k size. Note that -lpthread needs to be specified since sqlite3.c uses it (I think).

I''''''''m not sure how the static library can be used. When I try

~/dev/build$ gcc -O2 -o sqlite3 tsrc/shell.c -ldl -lpthread -l:libsqlite3.a

I end up with an executable of 1.4MB in size. It still works but I think it''''''''s not right

When cross-compiling sqlite-3.4.0, I encounter this linkage error:

./.libs/libsqlite3.s undefined reference to `dlclose''''''''
./.libs/libsqlite3.s undefined reference to `dlopen''''''''
./.libs/libsqlite3.s undefined reference to `dlsym''''''''

The solution:
===========
I added in Makefile.in the "-ldl" at the end of the line.
----
sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h
$(LTLINK) $(READLINE_FLAGS) $(LIBPTHREAD) \
-o [email protected] $(TOP)/src/shell.c libsqlite3.la \
$(LIBREADLINE) $(TLIBS) -ldl

My configure command is:
--------------------------------------
./configure
''''''''--build=i686-linux'''''''' \
--host=powerpc-wrs-linux-gnu \
--prefix=/usr/local \
''''''''--disable-tcl'''''''' \
''''''''--disable-debug'''''''' \
''''''''--with-gnu-ld'''''''' \
''''''''--enable-threadsafe'''''''' \
''''''''--enable-releasemode'''''''' \
--disable-static

sqlite 移植到arm-linux

不過他們用的sqlite版本相對都要老一些,有很多說明已經不太實用。以下引用yeshi的文章,來自http://blog.chinaunix.net/u/16292/showart_149594.html:

首先在http://www.sqlite.org/download.html上下載sqlite-3.3.13.tar.gz
$ tar -zxvf sqlite-3.3.13.tar.gz ~/sqliteforuclinux/
$ cd sqliteforuclinux/sqlite-3.3.13
檢視readme,內容為:
For example:
    tar xzf sqlite.tar.gz    ;# Unpack the source tree into "sqlite"
    mkdir bld                ;# Build will occur in a sibling directory
    cd bld                   ;# Change to the build directory
    ../sqlite/configure      ;# Run the configure script
    make                     ;# Run the makefile.
    make install             ;# (Optional) Install the build products
我們現在要做的是交叉編譯,要是為本機編譯,可以照做就可以了
$ mkdir bld
$ cd bld
export config_BUILD_CC=gcc
export config_TARGET_CC=arm-linux-gcc
修改bld/目錄下的 configure 檔案的部分內容
20420行 { (exit 1); exit 1; }; }改為 { (echo 1); echo 1; }; }
20446行 { (exit 1); exit 1; }; }改為 { (echo 1); echo 1; }; }
$ ../sqlite-3.3.13/configure --disable-tcl --prefix=/home/yeshi/sqliteforuclinux/bld --host=arm-linux
將/bld/Makefile檔案中如下語句
BCC = arm-linux-gcc -g -O2 
改成:
BCC = gcc -g -O2 //紅色字型的是上面貼子上的,我的不用改的,已經是BCC = gcc -g 
(我的也已經不需要改)
$make 
$make install 
bld/lib 目錄下,
庫檔案已經生成在為了減小執行檔案大小可以用strip處理,去掉其中的除錯資訊。
arm-linux-strip libsqlit3.so.0

在這個過程中起先遇到了不認識編譯器的問題,修改環境變數解決問題,而這個文章中沒有提到的是link tag的問題,要修改一下makefile檔案,把 --tag=arm-linux放到libtool欄位的link段的後面,去掉$(TCC),或者在$(TCC)之前空一格然後添上--tag=CC