SQLite3源碼在Windows平台編譯


SQLite3源碼在Windows平台編譯

工具:Mingw32
方法:命令行,盡量使用管理員模式

gcc -shared sqlite3.c -o sqlite3.dll

 注意MinGW只生成32位的dll。另有一個分開的MinGW64工程可以用來生成64位的dll。可以推斷其命令行語法是類似的。需要注意的是最近的MSVC的版本生成的DLLs可能不能工作到WinXP或者更早版本的windows上。因此為了最大限度的兼容你的生成的dll,推薦MinGW。一個好的經驗法則是使用MinGW去生成32位的dlls,使用msvc去生成64位的dlls。

在大部分情況下,你會想要去哦去提供編譯時間相關的選項的基本的命令來調整你的程序。通常使用的編譯時間相關的選項包括:

  • -Os - Optimize for size. Make the DLL as small as possible.

  • -O2 - Optimize for speed. This will make the DLL larger by unrolling loops and inlining functions.

  • -DSQLITE_ENABLE_FTS4 - Include the full-text search engine code in SQLite.

  • -DSQLITE_ENABLE_RTREE - Include the R-Tree extension.

  • -DSQLITE_ENABLE_COLUMN_METADATA - This enables some extra APIs that are required by some common systems, including Ruby-on-Rails.


工具:Visual Studio 2010

(1)把SQLite編譯成動態鏈接庫:
    打開Visual Studio 2010,新建一個名為sqlite3的Visual C++ Win32工程,在工程向導頁中選擇工程的類型為 "DLL", 並且把創建為空項目的復選框鈎上。通過工程--->添加現有項...,把單一文件sqlite3.c添加到工程中。為了生成在鏈接sqlite3.dll時需要用到的lib文件,需要在工程中添加模塊定義文件。根據sqlite3.h中列出的導出函數名,我們可以自己寫.def文件,例如:
EXPORTS
sqlite3_aggregate_context
sqlite3_aggregate_count
sqlite3_auto_extension
sqlite3_backup_finish
sqlite3_backup_init
sqlite3_backup_pagecount
sqlite3_backup_remaining
sqlite3_backup_step
sqlite3_bind_blob
sqlite3_bind_double
;......
    也可以使用已寫好的.def文件,下載已編譯好的SQLite DLL庫sqlite-dll-win32-x86-3071400.zip,里面有sqlite3.def,把它拷貝到我們的sqlite3項目中,在工程屬性的Linker--->Input--->Module Definition File中輸入sqlite3.def。設置項目編譯成Release版本,編譯后生成sqlite3.dll和sqlite3.lib。
    編譯命令行管理工具:如果想編譯出sqlite.exe命令行程序,則需要創建一個空的Win32 控制台程序,然后在往工程里添加文件sqlite3.c和shell.c,直接編譯即可。

    使用動態鏈接庫sqlite3.dll

    新建一個空項目test,把sqlite3.dll, sqlite3.lib, sqlite3.h拷貝到項目目錄下,把sqlite3.h添加到項目中。新建主程序源文件test.cpp,如下:

復制代碼
#include <stdio.h> #include "sqlite3.h" #pragma comment(lib,"sqlite3") /* print a record from table outputed by sql statement */ static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; 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]); return(1); } rc=sqlite3_open(argv[1],&db); /* open database */ if(rc){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return(1); } rc=sqlite3_exec(db,argv[2],callback,0,&zErrMsg); /* execute SQL statement */ if(rc!=SQLITE_OK){ fprintf(stderr,"SQL error: %s\n",zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); /* close database */ return 0; }
復制代碼

    編譯后生成test.exe程序,它的運行依賴於sqlite3.dll。注意程序中也可以不使用pragma指令導入sqlite3.lib,而是在test項目屬性中添加對上面的dll項目sqlit3的引用。
    這個C程序的例子顯示怎么使用sqlite的C/C++接口。數據庫的名字由第一個參數取得,第二個參數是一條或更多的SQL執行語句。這個程序調用sqlite3_open()打開指定的數據庫,調用sqlite3_exec()對數據庫執行SQL語句,callback函數會作用在SQL語句結果集的每條記錄上。最后用sqlite3_close()關閉數據庫連接。可以用前面的alf.db數據庫來測試:test.exe alf.db "select * from mytable"。
    (2)把SQLite編譯成靜態鏈接庫:
    新建一個名為sqlite3static,空的Visual C++ Win32工程,在工程向導頁中選擇工程的類型為 "Static library",去年"Precompiled header"復選框,導入源文件sqlite3.c,編譯生成sqlite3static.lib,這是靜態鏈接庫版本,它要比動態鏈接庫sqlite3.dll大的多。
    使用靜態鏈接庫:
    新建一個空項目sqlite3statictest,添加對項目sqlite3static的引用,同樣使用上面的test.cpp,編譯生成sqlite3statictest.exe。可以發現它是一個獨立的可執行文件,不依賴靜態鏈接庫,刪除靜態鏈接庫后仍然可以運行。
    實際上,靜態鏈接庫不存在導出的概念,在鏈接過程中,靜態鏈接庫LIB中的指令都全部被直接包含在最終生成的EXE文件中了,因此如果用的是靜態鏈接庫,那么也就不存在“導出某個函數提供給用戶使用”的情況。對於使用該靜態庫的EXE文件來說,直接使用LIB中的函數和全局變量即可,而不管它們有沒有導出聲明。另外一點在使用中需要注意的是:靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含。

工具:VC++6.0

 需要從SQLite官網下載源代碼

  sqlite-amalgamation-*.zip

  sqlite-dll-win32-x86-*.zip

  sqlite-src-*.zip

  sqlite-preprocessed-*.zip

 1、  編譯成Win32下的應用程序(*.exe),用於命令行模式下的調試

  (1)啟動VC++6.0,創建一個Win32 Console Application空的工程,工程名為“SQlite”;

  (2)將sqlite-amalgamation-*.zip 解壓后的shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h添加到工程中,直接編譯即可生成sqlite.exe,可以在命令提示符下進行測試。

      

 編譯時,出現以下錯誤:unresolved external symbol __beginthreadex
            unresolved external symbol __endthreadex

 這是在使用MFC的類時出現連接錯誤。

 解決方法:

 1.工程右鍵——>“Project”菜單——〉“Setting”菜單項——〉General選項卡,在Microsoft Fountion Classes:中選擇:Use MFC in Static Library。
 2.再在C/C++選項卡中的在Category中選擇Code Generation,再在Use run-time library中選擇Debug Multithreaded(若在Win32 Debug環境下)或者multithreaded。

 其中:
  Single-Threaded單線程靜態鏈接庫(release版本)
  Multithreaded多線程靜態鏈接庫(release版本)
  multithreaded DLL多線程動態鏈接庫(release版本)
  Debug Single-Threaded單線程靜態鏈接庫(debug版本)
  Debug Multithreaded多線程靜態鏈接庫(debug版本)
  Debug Multithreaded DLL多線程動態鏈接庫(debug版本)

   2、編譯生成Win32平台下的動態鏈接庫(*.dll)。

    (1)啟動VC++6.0,創建一個Win32 Dynamic_Link Library,選擇一個空的DLL工程,工程名為“SQLite_Win32_DLL”;

  (2)將sqlite-amalgamation-*.zip解壓后的sqlite3.c、sqlite3.h、sqlite3ext.h以及sqlite-dll-win32-x86-*.zip解壓后的sqlite3.def模塊定義文件一起添加到工程中;

         

 (3)【Project】->【Settings…】->【C/C++】->【Category】->【General】->【Preprocessor definitions】

    新增編譯選項:SQLITE_ENABLE_COLUMN_METADATA,編譯通過即可生成dll。

    

 但此時只生成了sqlite_win32_dll.dll文件,沒有生成對應的引入庫(sqlite_win32_dll.lib)文件。

 具體方法是如下:

 修改sqlite3.c文件中的SQLITE_API宏定義,將“# define SQLITE_API”修改成“# define SQLITE_API __declspec(dllexport)”。

 

 或者直接把sqlite3.def添加在Linker--->Input--->Module Definition File中。

 

 再重新編譯即可生成sqlite_win32_dll.dll和sqlite_win32_dll.lib。


免責聲明!

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



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