源代碼:
Windows 上編譯 SqlCipher
準(zhǔn)備工作
- Visual Studio 任意一個(gè)版本, 這里使用的是 VS 2017
- ActiveState ActivePerl
- Mingw, 安裝 minimum installer 即可
- nasm
- ActiveState ActiveTcl
編譯 OpenSSL
使用管理員權(quán)限, 打開
x86 Native Tools Command Prompt for VS 2017
工具.切換到 OpenSSL 目錄下
-
執(zhí)行以下命令
# perl Configure VC-WIN32 -static --prefix=你的安裝位置 // 以靜態(tài)庫方式進(jìn)行編譯 perl Configure VC-WIN32 --prefix=你的安裝位置 // 以動(dòng)態(tài)庫方式進(jìn)行編譯 nmake nmake test // 測(cè)試. 如果全部成功, 會(huì)輸出 All tests successful nmake install // lib 安裝到了你指定的位置上
一般情況下, nmake 執(zhí)行完成后, 沒有錯(cuò)誤出現(xiàn)
-
在目錄下已經(jīng)生成了文件
靜態(tài)庫
libcrypto.lib
libssl.lib
動(dòng)態(tài)庫
libcrypto.lib
libcrypto_1-1.dll
libssl.lib
libssl.dll
注意: 這里說的編譯過程使用的是 OpenSSL V1.1.1 版本, 其他版本的編譯方式略有不同. 具體參看源代碼目錄下的 INSTALL
文件(后面可能跟著 OS 版本). 比如, 1.0.2n 的編譯方式就不一樣.
編譯 SQLCipher
方式一
進(jìn)入工程目錄悠汽,打開
Makefile.msc
文件將
-DSQLITE_TEMP_STORE
從1
改為2
箱吕。 注意:此處 TCC 與 TCC 一起改動(dòng)-
添加
-DSQLITE_HAS_CODEC
,-DSQLCIPHER_CRYPTO_OPENSSL
,-DSQLITE_ENABLE_FTS4
,-DSQLITE_ENABLE_JSON1
,-DSQLITE_ENABLE_FTS3
,-DSQLITE_ENABLE_FTS3_PARENTHESIS
,-DSQLITE_ENABLE_FTS5
,-DNOCRYPT
到 TCC 與 RCC 中TCC = $(TCC) -DSQLITE_TEMP_STORE=2 RCC = $(RCC) -DSQLITE_TEMP_STORE=2 # Add DSQLITE_TEMP_STORE to gcc & rcc TCC = $(TCC) -DSQLITE_HAS_CODEC RCC = $(RCC) -DSQLITE_HAS_CODEC TCC = $(TCC) -DSQLITE_ENABLE_FTS4 RCC = $(RCC) -DSQLITE_ENABLE_FTS4 TCC = $(TCC) -DSQLITE_ENABLE_JSON1 RCC = $(RCC) -DSQLITE_ENABLE_JSON1 TCC = $(TCC) -DSQLITE_ENABLE_FTS3 RCC = $(RCC) -DSQLITE_ENABLE_FTS3 TCC = $(TCC) -DSQLITE_ENABLE_FTS3_PARENTHESIS RCC = $(RCC) -DSQLITE_ENABLE_FTS3_PARENTHESIS TCC = $(TCC) -DSQLITE_ENABLE_FTS5 RCC = $(RCC) -DSQLITE_ENABLE_FTS5 TCC = $(TCC) -DNOCRYPT RCC = $(RCC) -DNOCRYPT TCC = $(TCC) -DSQLCIPHER_CRYPTO_OPENSSL RCC = $(RCC) -DSQLCIPHER_CRYPTO_OPENSSL
-
添加 h 文件搜索路徑
TCC = $(TCC) -IC:\Users\lma\Desktop\Sqlcipher\opemssl_install_1.1.1\include RCC = $(RCC) -IC:\Users\lma\Desktop\Sqlcipher\opemssl_install_1.1.1\include
-
添加 link 文件路徑
LTLIBPATHS = $(LTLIBPATHS) /LIBPATH:C:\Users\lma\Desktop\Sqlcipher\opemssl_install_1.1.1\lib LTLIBS = $(LTLIBS) libcrypto.lib
打開 VS 自帶的本機(jī)編譯工具,執(zhí)行
nmake /f Makefile.msc sqlite3.c
方式二
運(yùn)行
mingw-get.exe
程序, 根據(jù)需要安裝 SQLCipher 編譯環(huán)境.使用管理員權(quán)限運(yùn)行
mingw\msys\1.0\msys.bat
, 進(jìn)入 msys shell 命令環(huán)境切換目錄到 SQLCipher 源代碼目錄
-
使用以下命令配置
./configure --enable-tempstore=yes --with-crypto-lib=none --disable-tcl CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DNOCRYPT -lcrypto -I/e/SQLiteWithCipher/openssl/include -L/e/SQLiteWithCipher/sqlcipher/ -static-libgcc" LDFLAGS="libcrypto.lib"
-
執(zhí)行編譯命令
- make clean 清理
- make sqlite3.c 生成
sqlite3.c
- make 生成可執(zhí)行文件
sqlite3.exe
- make dll 生成庫文件
sqlite3.dll
- lib /def:sqlite3.def 生成
sqlite3.lib
如果需要靜態(tài)庫, 根據(jù)生成的 sqlite3.c 等文件自己建立一個(gè)工程, 生成 .lib 文件即可.
錯(cuò)誤
-
It looks like you don't have either nmake.exe or dmake.exe on your PATH,
It looks like you don't have either nmake.exe or dmake.exe on your PATH, so you will not be able to execute the commands from a Makefile. You can install dmake.exe with the Perl Package Manager by running: ppm install dmake
直接按照提示安裝 dmake 即可
-
nmake test 過程中出現(xiàn)
Dubious, test returned 255 (wstat 65280, 0xff00)
問題更換 OpenSSL 到無中文路徑的目錄下, 重新編譯測(cè)試.
Mac 上編譯 SqlCipher
編譯 OpenSSL
打開終端
進(jìn)入 OpenSSL 源代碼目錄下
-
執(zhí)行以下命令
# ./Configure darwin64-x86_64-cc --prefix=yourlibdir CPPFLAGS="-mmacosx-version-min=10.7" # make # make test // 測(cè)試. 如果全部成功, 會(huì)輸出 All tests successful # make install_sw // 將生成的庫放到 yourlibdir 中
darwin-i386-cc 是 32 位編譯, darwin64-x86_64-cc 是 64 位編譯.
yourlibdir 是最終安裝的絕對(duì)路徑
-
在
yourlibdir
目錄下已經(jīng)生成了文件libcrypto.1.1.dylib
libcrypto.a
libssl.1.1.dylib
libssl.a
編譯 SQLCipher
打開終端
切換目錄到 SQLCipher 源代碼目錄
-
使用以下命令配置
./configure --enable-tempstore=yes --disable-tcl --with-crypto-lib=none CFLAGS="-mmacosx-version-min=10.7 -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DNOCRYPT -I/openssllib/include" LDFLAGS="/openssllib/lib/libcrypto.a" CC=clang --prefix=yourlibdir
-
執(zhí)行編譯命令
- make clean 清理
- make 生成可執(zhí)行文件
sqlcipher
,sqlite3.c
等文件 - make install // 將生成的庫放到 yourlibdir 中
錯(cuò)誤
-
error C2220: 警告被視為錯(cuò)誤 - 沒有生成“object”文件
我是在 Windows 上遇到這個(gè)問題. 這是由于 OpenSSL 1.0.2n 版本編譯的時(shí)候警告級(jí)別的問題. 只需要降低警告級(jí)別就可以了柿冲,打開 ntdll.mak 文件茬高,大概在第19行附近,將 CFLAG 參數(shù)中的 /W3 改成 /W0 就可以了
-
file was built for archive which is not the architecture being linked
由于在 sqlcipher 編譯過程中, 將 crypto.a 文件打包進(jìn)入了 sqlitecipher.a 文件中, 導(dǎo)致了編譯 node-sqlite3 的時(shí)候, 內(nèi)嵌 sqlitecipher.a 文件的時(shí)候出現(xiàn)了錯(cuò)誤. 截取了部分 sqlcipher 編譯的輸出:
libtool: link: (cd ".libs" && rm -f "libsqlcipher.dylib" && ln -s "libsqlcipher.0.dylib" "libsqlcipher.dylib") libtool: link: ar cru .libs/libsqlcipher.a /Users/jack/Desktop/SQLiteWithCipher/lib/openssl/lib/libcrypto.a sqlite3.o libtool: link: ranlib .libs/libsqlcipher.a
在上面我們看到, 連接的時(shí)候直接把 .a 與 .o 寫入了 libsqlcipher.a 中. 那么來驗(yàn)證一下我們的猜想:
$ ar t libsqlcipher.a __.SYMDEF SORTED libcrypto.a sqlite3.o
.a 文件, 其實(shí)就是 .o 文件的組合包. 但是里面混入了 .a 文件, 那么其他程序鏈接的時(shí)候就會(huì)出現(xiàn)錯(cuò)誤. 這個(gè)時(shí)候有兩種解決辦法.
-
將 .a 解包獲取 .o 文件(如果有源代碼的話, 直接把 .o 文件拷貝過來), 使用. ot 文件重新打包.
rm **.a ar rcs **.a 11.o 22.o clang -o test **.a test.o
修改上面的命令, 重新打包不包含 .a 文件的靜態(tài)庫.
-
參考
Building SQLCipher for node.js on Raspberry Pi 2
Linker complains “file was built for archive which is not the architecture being linked”