1. 程式人生 > >SQLCipher Windows下的編譯

SQLCipher Windows下的編譯

由於專案需要,需要編譯SQLCipher 以便保持ios android windows統一

1.安裝vs2013,其他的我沒有測試過
2.安裝 Activestate Perl, 下載地址http://www.activestate.com/activeperl
3.下載並編譯openssl,我用的版本是openssl-1.0.1p.tar.gz
如何編譯這個我在我的另一篇教程裡面提到了,參考http://blog.csdn.net/herorazor/article/details/47610445
4.安裝Mingw 網址:http://sourceforge.net/projects/mingw/files/
下載那個名字叫Download
mingw-get-setup.exe (86.5 kB)的東西 安裝以後如圖

這裡寫圖片描述

5.安裝gcc msys mingw等相關工具,具體的我也是自己差什麼安裝什麼,官網說的不太清楚
反正gcc msys tclsh相關的都安裝.不然後面編譯會報錯!
比如我當時沒下tclsh相關的就報tclsh command not found,
gcc沒裝就報checking for gcc... no
所以能選的都選上吧。。我這個上面折騰很久。。
安裝方法,例如msys, 
(1)選擇左側MSYS Base System, 
(2)右側msys-base 點選右鍵選擇Mark for installation
(3
)然後點選軟體選單裡面裡面的installation中的Apply Changes, 然後彈出一個對話方塊,點選Apply,就開始安裝

這裡寫圖片描述

6.安裝完成以後 ,會在c盤生成C:\MinGW等資料夾

這裡寫圖片描述
這裡寫圖片描述

7.準備開始編譯了,先設定環境變數,我的變數參考C:\Perl\bin;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE;C:\MinGW\msys\1.0\bin;c:\MinGW\bin
之前編譯好的openssl 會在c盤生成檔案,如下圖,如何生成請參考的我上面給的連線地址

這裡寫圖片描述

8.openssl 生成的ibeay32.lib libeay32.dll等全部拷貝一份在sqlcipher主目錄下
執行C:\MinGW\msys\1.0\msys.bat,然後進入sqlcipher主目錄下,
命令列cd D:\sqlcipher\sqlcipher-master
然後開始執行
./configure --with-crypto-lib=none --disable-tcl CFLAGS="-DSQLITE_HAS_CODEC -DSQLCIPHER_CRYPTO_OPENSSL -I/c/opensslbuild32/include /d/sqlcipher/sqlcipher-master/libeay32.dll -L/d/sqlcipher/sqlcipher-master/ -static-libgcc" LDFLAGS="-leay32"
這個不能複製貼上很蛋疼,引數中的路徑可以自己修改下

然後依次繼續執行命令
make clean
make sqlite3.c
make
make dll

此時應該就會生成sqlite3.c檔案了

這裡寫圖片描述

9.然後就開始使用了,sqlite3.h  sqlite3.c sqlite3ext.h ssleay32.dll ssleay32.lib libeay32.dll libeay32.lib 這幾個檔案拷貝到一個新建工程下面就開始使用了
vs工程裡面新增如下巨集定義
SQLITE_HAS_CODEC=1
CODEC_TYPE=CODEC_TYPE_AES128
SQLITE_CORE
THREADSAFE
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
SQLITE_ENABLE_COLUMN_METADATA
附帶一個測試程式碼
// Test.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "sqlite3.h"

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
    //feed this callback function to handle theresultset returned by the select statement
    int i;
    for (i = 0; i < argc; i++) { //loop over results
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); //gota love how human radable c is
    }
    printf("\n");
    return 0;
} //end callback
int _tmain(int argc, _TCHAR* argv[])
{
    sqlite3 *db;

    if (sqlite3_open("test.db3", &db) == SQLITE_OK)
    {
        int n = sqlite3_key(db, "123", 3);
        //sqlite3_rekey(db, "", 0);

        /*printf("DB file is open\n");
        if (sqlite3_exec(db, (const char*)"PRAGMA key ='password'", NULL, NULL, NULL) == SQLITE_OK){
        printf("Accepted Key\n");
        };*/
        if (sqlite3_exec(db, (const char*)"CREATE TABLE StaffMember (sid varchar(256), name varchar(20),age varchar(20));", NULL, NULL, NULL) == SQLITE_OK) {
            printf("Created Table\n");
        };
        /*if (sqlite3_exec(db, (const char*)"INSERT INTO testtable (id,name) values (0,'alice'), (1,'bob'), (2,'charlie');", NULL, NULL, NULL) == SQLITE_OK) {
            printf("Gave it some data\n");
            };
            */


        if (sqlite3_exec(db, (const char*)"insert into StaffMember(sid, name, age) values('001', '草泥馬', '17')", NULL, NULL, NULL) == SQLITE_OK)
        {
        printf("Sent Select\n");
        }

        if (sqlite3_exec(db, (const char*)"SELECT * FROM StaffMember;", callback, NULL, NULL) == SQLITE_OK) {
            printf("Sent Select\n");
        };
        /*if (sqlite3_exec(db, (const char*)"delete from StaffMember where sid = '001'", NULL, NULL, NULL) == SQLITE_OK)
        {
        printf("Sent Select\n");
        }*/



    }
    sqlite3_close(db);  //close it up properly
    return 0;
}

這裡寫圖片描述

10.參考文獻http://www.jerryrw.com/howtocompile.php