SQLCipher Windows下的編譯
阿新 • • 發佈:2018-12-20
由於專案需要,需要編譯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