SQLite3源碼在Linux下編譯


SQLite3源碼在Linux下編譯

(1)編譯命令行管理工具:gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3  //將生成sqlit3命令行管理工具
   
(2)編譯SQLite為單獨的動態鏈接庫:gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so    
    -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

    -shared:表示生成一個共享目標文件(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),即我們所說的動態鏈接庫。它可以和其他目標文件連接產生可執行文件。只有部分系統支持該選項。

    pthread系統庫用於確保SQLite是線程安全的。但因為命令行工具是單線程的,對命令行工具則可編譯成非線程安全的,以忽略pthread庫。命令為gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -o sqlite3。dl系統庫用於支持動態裝載,sqlite3_load_extension()接口和SQL函數load_extension()需要用到它。如果不需要這些特性,可以使用SQLITE_OMIT_LOAD_EXTENSION編譯選項來忽略,如gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3。

    使用動態庫libsqlite3.so:在你的程序中(例如test.c)通過包含頭文件sqlite3.h來使用庫中的函數,編譯程序的命令為gcc test.c -L. -lsqlite3 -o test。其中-L.表示讓鏈接庫的搜索路徑包含當前目錄,-lsqlite3指明編譯器查找動態庫libsqlite3.so,編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱。通過ldd test可查看test程序是如何調用動態庫中的函數的。

    調用動態庫時有幾個問題會經常碰到。有時明明已經將庫的頭文件所在目錄通過 “-I” include進來了,庫所在文件通過 “-L”參數引導,並指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是修改LD_LIBRARY_PATH,這個環境變量指示動態連接器可以裝載動態庫的路徑。或者修改/etc/ld.so.conf文件,然后調用/sbin/ldconfig來達到同樣的目的。通常這樣做就可以解決庫無法鏈接的問題了。


(3)編譯成靜態庫:gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o  //編譯成目標文件
             ar -r libsqlite3.a sqlite3.o  //將列出的各個目標文件一起打包成一個靜態庫libsqlite3.a

    鏈接靜態庫:gcc test.c -L. -lsqlite3 -static -o test  //也可不加-static選項


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM