(一) 背景
根據項目需求,需要使用數據庫存放一些數據,比如Web登錄的賬號和密碼,開發板的配置參數,以及後期所採集RTU設備的數據等。這裏選擇了適合嵌入式產品的數據庫 -- sqlite。
(二) 移植平臺和環境
主機端:Ubuntu; ARM板:ZLG EasyARM-i.MX283A、飛凌MX6UL-C;
Sqlite版本:3.7.14(3.7.14.0 或 3.7.14.1);安裝包:sqlite-autoconf-3071400.tar.gz 或 sqlite-autoconf-3071401.tar.gz。
(三) 步驟:
1. 解壓安裝包
$ tar -zvf sqlite-autoconf-3071401.tar.gz
$ cd sqlite-autoconf-3071401
2. 建立不同目錄
在開發產品時,爲了效率以及使用的方便性,一般會先在主機端進行程序的設計和驗證,而後再經交叉編譯,把ARM板可執行的二進制文件copy到指定的路徑。故這裏涉及到移植兩個版本,即主機端和ARM板。由於在配置和編譯安裝時,會產生一些不同的文件,爲了清晰,及管理的方便,這裏建立了不同目錄,以示區分:
$ mkdir build
$ cd build
$ mkdir x86 arm (主機端和ARM板文件在不同目錄下)
3.1 編譯x86版本(主機端)
$ cd x86
$ ../../configure --prefix=/usr/local
$ make
$ sudo make install
$ sudo ldconfig
上面配置命令中,--prefix選項後面的路徑是編譯安裝後目標安裝的位置,當然這個位置可以自定義;安裝完成後,產生的文件會存放在配置時指定的目錄。bin目錄下放的是sqlite3的可執行文件(sqlite3),lib目錄下放的是庫文件(libsqlite3.a、libsqlite3.so.0、libsqlite3.so.0.8.6、libsqlite3.la、libsqlite3.so),include目錄下放的是頭文件(sqlite3.h),編譯程序時會用到。 注1:所有設置的路徑或目錄,自己要清晰,否則按照文檔執行;
注2:執行上述make時,可能(不客氣的說一般都會)出現“SQLite header and source version mismatch”的錯誤。
解決方法:(原因)主機端linux系統默認安裝了舊版本的SQLite,故需要先把其刪除,包括/usr/lib/i386-linux-gnu路徑下:libsqlite3.so.0和libsqlite3.so.0.8.6兩個文件;然後按照上述依次執行:make、make install、ldconfig。
最後執行:sqlite3 -version,即可看到版本結果。
$ sqlite3 -version
$ 3.7.14.1 2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb
注:(x86)編譯:gcc -o pass.cgi pass.c cgic.c -lsqlite3 要加靜態鏈接 (主機端)
3.2 編譯arm版本(ARM板)
$ cd ../arm (進到arm目錄)
(1)$ ../../configure CC=/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc --host=arm-linux --prefix=/home/liuxu/sqlite/sqlite-autoconf-3071400/build/arm/target (ZLG)
(2)$ ../../configure CC=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc --host=arm-linux --prefix=/home/liuxu/sqlite/sqlite-autoconf-3071401/build/arm/target (飛凌)
注1:很容易出問題,注意自己主機端交叉編譯器的安裝路徑,以及自己設置的編譯和安裝路徑;
注2:(1)和(2)硬件環境和軟件版本不同,飛凌自帶的版本爲3.7.14.1。
$ make
$ make install
上面配置中,CC指定了ARM的編譯工具鏈,--host指定了平臺,安裝路徑爲當前目錄的target目錄下;install完成後,會在target目錄下生成我們所需的執行文件,庫文件和頭文件等。
注:交叉編譯:
$ arm-fsl-linux-gnueabi-gcc -o home-page.cgi home-page.c cgic.c -I /home/liuxu/sqlite/sqlite-autoconf-3071401/build/arm/target/include/ -L /home/liuxu/sqlite/sqlite-autoconf-3071401/build/arm/target/lib/ -lsqlite3 (飛凌)
其中,-I指定頭文件的路徑,-L指定庫文件的路徑。
4. 移植sqlite到ARM板
(1) 產品開發時,必須考慮ARM板內存空間的問題。爲了節省空間,需對文件瘦身,去掉沒用的調試信息。如下:
$arm-fsl-linux-gnueabi-strip ./target/lib/libsqlite3.so.0.8.6
$arm-fsl-linux-gnueabi-strip ./target/lib/libsqlite3.a
$arm-fsl-linux-gnueabi-strip ./target/bin/sqlite3
strip前後,可執行:ls -l sqlite3查看“瘦身”前後文件大小的變化。
(2) 完成上述操作後,還需要把所得到的特定文件放到ARM板上。可以參照主機端,編譯x86版本時產生文件的路徑,把相應的文件放到ARM板上。如/usr/local目錄相對應的子目錄,把sqlite3拷貝到ARM板上的/usr/local/bin下,把/lib下的所有文件拷貝到ARM板/usr/local/lib目錄下。
注:不同的ARM板,文件存放的路徑不同,上述只是參考。
5. ARM板上命令行測試
(1) 版本號:sqlite3 -version
(2) 建立或打開數據庫:sqlite3 info.db
(3) 創建數據表:create table user_table(userName,userPasswd);
(4) 向數據表中插入數據:insert into user_table(userName,userPasswd) values(“admin”,”1234”);
(5) 查詢數據表:select * from user_table;
(6) 查詢數據庫信息:.databases
(7) 查詢數據庫中的表信息:.tables
(8) 退出:.exit
注:注意命令行中“;”和“.”的使用。
趁熱打鐵,這裏只是總結了嵌入式數據庫SQLite的移植和注意項,對其深入的使用和學習,需在接下來的工作中進行。