1. 程式人生 > >使用VS2017編譯sqlite和在VS2017中配置使用sqlite的簡單例子演示

使用VS2017編譯sqlite和在VS2017中配置使用sqlite的簡單例子演示

知識補充:

        sqlite3.dll動態連結庫,它允許程式共享執行特殊任務所必需的程式碼和其他資源。

        動態的sqlite3.lib相當於一個h檔案,是對實現部分(.dll檔案)的匯出部分的宣告。編譯後只是將匯出宣告部分編譯到宿主程式中,其生成的sqlite3.exe在執行時需要相應的dll檔案支援 。

        靜態的sqlite3.lib將匯出宣告和實現都放在lib中。編譯後所有程式碼都嵌入到宿主程式,其生成的sqlite3.exe可直接執行。

任務:

        一.使用VS2017編譯sqlite3,生成動態的sqlite3.lib和sqlite3.dll(sqlite3.dll在官網中也可下載到)。在VS2017中編寫簡單程式,使用動態的sqlite3.lib和sqlite3.dll。

        二.使用VS2017編譯sqlite3,生成靜態的sqlite3.lib。在VS2017中編寫簡單程式,使用靜態的sqlite3.lib。

任務一:

1.在sqlite官網 http://www.sqlite.org/download.html 上下載sqlite-amalgamation-3071000.zip 和sqlite-dll-win32-x86-3071000.zip(我用的此版本)。

2.分別解壓上述兩個檔案到各自資料夾下(sqlite3.def、sqlite3.dll在同一資料夾sqlite-dll下)。

3.從VS2017的安裝目錄下Microsoft Visual Studio 10.0\VC\bin找到lib.exe和link.exe,從VS2017的安裝目錄下G:\Microsoft Visual Studio 10.0\Common7\IDE找到mspdb100.dll。將lib.exe link.exe mspdb100.dll放到步驟2中的sqlite-dll資料夾下。

4.開啟cmd視窗,轉到上述sqlite-dll資料夾下,我的是E:\SoftwareDesign\SQLite\sqlite-dll

5.輸入命令:LIB /DEF:sqlite3.def /machine:IX86。這時,在sqlite-dll資料夾下會出現sqlite3.lib。(這是動態的sqlite3.lib檔案,只有47KB大小。)

6.在VS2017中編寫簡單程式。檔案->新建->專案->Win32控制檯應用程式,命名為test1 。

7.將test1.cpp中的內容替換為以下程式碼:

  1. // test1.cpp : 定義控制檯應用程式的入口點。  
  2. //
      
  3. #include "stdafx.h"  
  4. #include <stdlib.h>  
  5. #include "sqlite3.h"  
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     int rc;  
  9.     int i, nrows, ncols, tr;  
  10.     char *errmsg = NULL;  
  11.     char **results;  
  12.     sqlite3 *db = NULL;  
  13.     rc = sqlite3_open("demodb", &db);  
  14.     if (rc)  
  15.     {  
  16.         fprintf(stderr, "can't open db!/n", sqlite3_errmsg(db));  
  17.         sqlite3_close(db);  
  18.         exit(1);  
  19.     }  
  20.     else  
  21.     {  
  22.         printf("db open successfully!/n");  
  23.     }  
  24.     sqlite3_get_table(db,"select * from clients;",&results,&nrows,&ncols,&errmsg);  
  25.     printf("DB has %d rows and %d cols/n/n",nrows,ncols);  
  26.     tr=(nrows+1)*ncols;  
  27.     for(i=0;i<tr;++i) //輸出查詢結果  
  28.     {  
  29.         printf("results[%d]= %s/n",i,results[i]); //此處可以自己定義輸出格式,  
  30.     }  
  31.     sqlite3_free_table(results); //free   
  32.     sqlite3_close(db);  
  33.     int a;  
  34.     scanf("%d",&a);//沒有此行程式碼,執行窗口出現後會馬山消失。  
  35.     return 0;  
  36. }  

8.將sqlite3.h、sqlite3.lib、sqlite3.dll複製到工程所在檔案目錄中。我的是E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test1\test1,如下圖所示:

9.在VS2017中,右鍵test1工程,新增->現有項,在出現的對話方塊中選擇上一步中的sqlite3.lib。(必須將lib檔案再新增到工程中)

10.按F5鍵,執行成功。

PS:這時,到工程所在檔案目錄下找到test1.exe(大小為29KB),我的是在E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test1\Debug。如果直接雙擊執行的話,會提示因缺少sqlite3.dll檔案而無法執行。這是因為動態的sqlite3.lib只是將宣告部分編譯到test1.exe中,執行時需要dll檔案的支援。將sqlite3.dll檔案複製到test1.exe同一目錄下,再雙擊執行test1.exe,就會執行成功。

任務二:

1.在VS2017中,檔案->新建->專案->Win32專案,命名為sqlite3(其他名稱也行)。在嚮導設定中,選擇DLL(D)、空專案。

2.將下載的sqlite-amalgamation-3071000.zip 中的“sqlite3.h”、“sqlite3.c”、“sqlite3ext.h”三個檔案新增到工程中,具體做法:右鍵sqlite3工程->新增->現有項,在出現的對話方塊中選擇上述三個檔案。

3.(release版本比debug版本體積小,執行速度快,所以操作中我釋出的是release版本)如下圖所示

4.按F7鍵編譯(或右鍵->生成)。在工程所在檔案目錄中會編譯出sqlite3.dll檔案。(PS:網上有的講解需要配置很多的引數等等,試了很多次都不成功,然而按照上述無需多餘操作即可成功。可能是VS或sqlite版本不同的原因)

5.編譯的同時會在工程所在目錄中產生sqlite3.obj檔案,我的是在E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\sqlite3\sqlite3\Release下。接下來要用到VS安裝目錄下的lib.exe檔案。將sqlite3.obj檔案複製到lib.exe所在目錄下,我的是G:\Microsoft Visual Studio 10.0\VC\bin。將G:\Microsoft Visual Studio 10.0\Common7\IDE下的mspdb100.dll,mspdbcore.dll,mspdbsrv.exe,msobj100.dll複製到lib.exe所在目錄下。

6.開啟cmd視窗,轉到lib.exe所在資料夾下,我的是G:\Microsoft Visual Studio 10.0\VC\bin。輸入命令:lib sqlite3.obj。這時會生成靜態的sqlite3.lib(大小為2.32MB)。

7.在VS2017中編寫簡單程式。檔案->新建->專案->Win32控制檯應用程式,命名為test2 。

8.test2.cpp中的程式碼替換為上述的程式碼。(任務一步驟7中的程式碼)

9.將sqlite3.h和步驟6中生成的靜態sqlite3.lib複製到test2工程所在的檔案目錄中,我的是E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test2\test2。

10.在VS2017中,右鍵test2工程->新增->現有項。選擇sqlite3.lib。

11.按F5鍵,執行成功。

PS:這時,在E:\SoftwareDesign\SQLite\VisualStudio2010Workspace\Projects\test2\Debug下會生成test2.exe(大小為501KB)。雙擊可以直接執行。此時不需dll檔案支援。因為靜態的sqlite3.lib將匯出宣告和實現都放在lib中,編譯後所有程式碼都嵌入到test2.exe,可直接執行。