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左右:
[root@ee301 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
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 $@ $(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 x*** 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
評論
查看更多