[关闭]
@caipiz 2019-01-23T11:56:43.000000Z 字数 24730 阅读 8218

编译Windows 64bit平台pysqlcipher3 for Python3.7

未分类


编译与安装

  1. 安装Python3 64bit
    https://www.python.org/ftp/python/3.7.2/python-3.7.2-amd64.exe

  2. 安装OpenSSL
    https://slproweb.com/products/Win32OpenSSL.html

    这里使用了Win64 OpenSSL v1.0.2q版本。

    注意需要将OpenSSL的dll安装到系统目录,如果只是安装在OpenSSL的bin目录的话,使用的时候需要将bin目录加入系统PATH,或者自行拷贝相关dll到调用程序目录。
    image.png-21.2kB

  3. 安装Tcl Windows(64-bit, x64)
    https://www.activestate.com/products/activetcl/downloads/

    我使用了8.6.8.0版本。

  4. 安装 VisualStudio 2017
    https://visualstudio.microsoft.com/zh-hans/downloads/
    社区版即可,只须安装“使用C++的桌面开发”相关工具集。
    image.png-130kB

  5. 下载 sqlcipher

    1. D:\MyDocs\Desktop>git clone https://github.com/sqlcipher/sqlcipher.git
  6. 生成sqlite3源码
    从开始菜单找到适用于 VS 2017 的 x64 本机工具命令提示,启动,打开附带了VS工作环境的控制台。
    image.png-9.9kB

    切换到sqlcipher源码目录,执行

    1. D:\MyDocs\Desktop\sqlcipher>nmake /f Makefile.msc

    结果

    1. Microsoft (R) 程序维护实用工具 14.16.27026.1
    2. 版权所有 (C) Microsoft Corporation 保留所有权利。
    3. copy .\tool\lempar.c .
    4. 已复制 1 个文件。
    5. cl -nologo -W4 -MT -DNDEBUG -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -O2 -Zi -wd4054 -wd4055 -wd4100 -wd4127 -wd4130 -wd4152 -wd4189 -wd4206 -wd4210 -wd4232 -wd4305 -wd4306 -wd4702 -wd4706 -Daccess=_access -Felemon.exe .\tool\lemon.c /link /DEBUG
    6. lemon.c
    7. del /Q parse.y parse.h parse.h.temp 2>NUL
    8. copy .\src\parse.y .
    9. 已复制 1 个文件。
    10. .\lemon.exe -DSQLITE_MAX_TRIGGER_DEPTH=100 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_STMTVTAB=1 -DSQLITE_ENABLE_DBPAGE_VTAB=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_INTROSPECTION_PRAGMAS=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 parse.y
    11. move parse.h parse.h.temp
    12. 移动了 1 个文件。
    13. tclsh .\tool\addopcodes.tcl parse.h.temp > parse.h
    14. type parse.h .\src\vdbe.c | tclsh .\tool\mkopcodeh.tcl > opcodes.h
    15. parse.h
    16. .\src\vdbe.c
    17. tclsh .\tool\mkopcodec.tcl opcodes.h > opcodes.c
    18. cl -nologo -W4 -MT -DNDEBUG -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -O2 -Zi -wd4054 -wd4055 -wd4100 -wd4127 -wd4130 -wd4152 -wd4189 -wd4206 -wd4210 -wd4232 -wd4305 -wd4306 -wd4702 -wd4706 -Femkkeywordhash.exe -DSQLITE_MAX_TRIGGER_DEPTH=100 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_STMTVTAB=1 -DSQLITE_ENABLE_DBPAGE_VTAB=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_INTROSPECTION_PRAGMAS=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 .\tool\mkkeywordhash.c /link /DEBUG
    19. mkkeywordhash.c
    20. .\mkkeywordhash.exe > keywordhash.h
    21. tclsh .\tool\mkshellc.tcl > shell.c
    22. cl -nologo -W4 -MT -DNDEBUG -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -O2 -Zi -wd4054 -wd4055 -wd4100 -wd4127 -wd4130 -wd4152 -wd4189 -wd4206 -wd4210 -wd4232 -wd4305 -wd4306 -wd4702 -wd4706 -Femksourceid.exe .\tool\mksourceid.c /link /DEBUG
    23. mksourceid.c
    24. tclsh .\tool\mksqlite3h.tcl . > sqlite3.h
    25. copy .\ext\fts5\fts5parse.y .
    26. 已复制 1 个文件。
    27. del /Q fts5parse.h 2>NUL
    28. .\lemon.exe -DSQLITE_MAX_TRIGGER_DEPTH=100 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_STMTVTAB=1 -DSQLITE_ENABLE_DBPAGE_VTAB=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_INTROSPECTION_PRAGMAS=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 fts5parse.y
    29. tclsh .\ext\fts5\tool\mkfts5c.tcl
    30. copy .\ext\fts5\fts5.h .
    31. 已复制 1 个文件。
    32. rmdir /Q/S tsrc 2>NUL
    33. mkdir tsrc
    34. for %i in (.\src\crypto.c .\src\crypto_cc.c .\src\crypto_impl.c .\src\crypto_libtomcrypt.c .\src\crypto_openssl.c .\src\crypto.h .\src\sqlcipher.h .\src\alter.c .\src\analyze.c .\src\attach.c .\src\auth.c .\src\backup.c .\src\bitvec.c .\src\btmutex.c .\src\btree.c .\src\build.c .\src\callback.c .\src\complete.c .\src\ctime.c .\src\date.c .\src\dbpage.c .\src\dbstat.c .\src\delete.c .\src\expr.c .\src\fault.c .\src\fkey.c .\src\func.c .\src\global.c .\src\hash.c .\src\insert.c .\src\legacy.c .\src\loadext.c .\src\main.c .\src\malloc.c .\src\mem0.c .\src\mem1.c .\src\mem2.c .\src\mem3.c .\src\mem5.c .\src\memdb.c .\src\memjournal.c .\src\mutex.c .\src\mutex_noop.c .\src\mutex_unix.c .\src\mutex_w32.c .\src\notify.c .\src\os.c .\src\os_unix.c .\src\os_win.c) do copy /Y %i tsrc
    35. ......略
    36. NMAKE : fatal error U1077: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\cl.EXE"”: 返回代码“0x2
    37. Stop.

    最终编译会报错,不过没关系,我们这里并不需要真正的编译,只需要中间生成的sqlite3.hsqlite3.c就够了。

    中间过程如果执行有其他差错,可以clean一下再重试

    1. D:\MyDocs\Desktop\sqlcipher>nmake /f Makefile.msc clean
  7. 编译正式的sqlcipher控制台程序(非必须)
    这并不是 pysqlcipher3 需要的,但如果自己想成功编译一份 sqlcipher 的 Windows 程序,可以参考这篇 Win64 setup — Compiling SQLCipher,修改Makefile.msc再构建。

  8. 下载pysqlcipher3

    1. git clone https://github.com/rigglemania/pysqlcipher3.git
  9. pysqlcipher3目录下创建amalgamation目录,拷贝上一步 sqlcipher 项目目录中生成的sqlite3.hsqlite3.c文件到其中。并在其下创建一个sqlcipher目录,且再次拷贝一份sqlite3.h文件到sqlcipher目录中。

  10. 执行编译

    1. D:\MyDocs\Desktop\pysqlcipher3>python setup.py build_amalgamation

    结果

    1. D:\MyDocs\Desktop\pysqlcipher3>python setup.py build_amalgamation
    2. running build_amalgamation
    3. Builds a C extension using a sqlcipher amalgamation
    4. building 'pysqlcipher3._sqlite3' extension
    5. creating build\temp.win-amd64-3.7
    6. creating build\temp.win-amd64-3.7\Release
    7. creating build\temp.win-amd64-3.7\Release\src
    8. creating build\temp.win-amd64-3.7\Release\src\python3
    9. creating build\temp.win-amd64-3.7\Release\amalgamation
    10. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\module.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\module.obj
    11. module.c
    12. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\connection.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\connection.obj
    13. connection.c
    14. src\python3\connection.c(1546): warning C4090: “=”: 不同的“const”限定符
    15. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\cursor.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\cursor.obj
    16. cursor.c
    17. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\cache.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\cache.obj
    18. cache.c
    19. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\microprotocols.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\microprotocols.obj
    20. microprotocols.c
    21. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\prepare_protocol.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\prepare_protocol.obj
    22. prepare_protocol.c
    23. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\statement.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\statement.obj
    24. statement.c
    25. src\python3\statement.c(138): warning C4090: “=”: 不同的“const”限定符
    26. src\python3\statement.c(158): warning C4244: “函数”: 从“Py_ssize_t”转换到“int”,可能丢失数据
    27. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\util.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\util.obj
    28. util.c
    29. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcsrc\python3\row.c /Fobuild\temp.win-amd64-3.7\Release\src\python3\row.obj
    30. row.c
    31. src\python3\row.c(101): warning C4090: “=”: 不同的“const”限定符
    32. src\python3\row.c(111): warning C4090: “=”: 不同的“const”限定符
    33. src\python3\row.c(168): warning C4244: “=”: 从“Py_ssize_t”转换到“int”,可能丢失数据
    34. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME=\"pysqlcipher3.dbapi2\" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_TEMP_STORE=2 -Dinline=__inline -Iamalgamation -Id:\Work\OpenSSL-Win64\include -ID:\work\Python37\include -ID:\work\Python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\cppwinrt" /Tcamalgamation\sqlite3.c /Fobuild\temp.win-amd64-3.7\Release\amalgamation\sqlite3.obj
    35. sqlite3.c
    36. amalgamation\sqlite3.c(23097): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    37. C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt\stdio.h(208): note: 参见“fopen”的声明
    38. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:D:\work\Python37\libs /LIBPATH:D:\work\Python37\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\ATLMFC\lib\x64" "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\um\x64" /EXPORT:PyInit__sqlite3 build\temp.win-amd64-3.7\Release\src\python3\module.obj build\temp.win-amd64-3.7\Release\src\python3\connection.obj build\temp.win-amd64-3.7\Release\src\python3\cursor.obj build\temp.win-amd64-3.7\Release\src\python3\cache.obj build\temp.win-amd64-3.7\Release\src\python3\microprotocols.obj build\temp.win-amd64-3.7\Release\src\python3\prepare_protocol.obj build\temp.win-amd64-3.7\Release\src\python3\statement.obj build\temp.win-amd64-3.7\Release\src\python3\util.obj build\temp.win-amd64-3.7\Release\src\python3\row.obj build\temp.win-amd64-3.7\Release\amalgamation\sqlite3.obj /OUT:build\lib.win-amd64-3.7\pysqlcipher3\_sqlite3.cp37-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.7\Release\src\python3\_sqlite3.cp37-win_amd64.lib libeay32.lib /LIBPATH:d:\Work\OpenSSL-Win64\lib
    39. 正在创建库 build\temp.win-amd64-3.7\Release\src\python3\_sqlite3.cp37-win_amd64.lib 和对象 build\temp.win-amd64-3.7\Release\src\python3\_sqlite3.cp37-win_amd64.exp
    40. 正在生成代码
    41. 已完成代码的生成
  11. 安装至python环境

    1. D:\MyDocs\Desktop\pysqlcipher3>python setup.py install

    结果

    1. running install
    2. running bdist_egg
    3. running egg_info
    4. writing pysqlcipher3.egg-info\PKG-INFO
    5. writing dependency_links to pysqlcipher3.egg-info\dependency_links.txt
    6. writing top-level names to pysqlcipher3.egg-info\top_level.txt
    7. reading manifest file 'pysqlcipher3.egg-info\SOURCES.txt'
    8. reading manifest template 'MANIFEST.in'
    9. warning: no previously-included files matching '*~' found anywhere in distribution
    10. warning: no previously-included files matching '*.pyc' found anywhere in distribution
    11. writing manifest file 'pysqlcipher3.egg-info\SOURCES.txt'
    12. installing library code to build\bdist.win-amd64\egg
    13. running install_lib
    14. running build_py
    15. running build_ext
    16. Builds a C extension linking against libsqlcipher library
    17. creating build\bdist.win-amd64
    18. creating build\bdist.win-amd64\egg
    19. creating build\bdist.win-amd64\egg\pysqlcipher3
    20. copying build\lib.win-amd64-3.7\pysqlcipher3\dbapi2.py -> build\bdist.win-amd64\egg\pysqlcipher3
    21. copying build\lib.win-amd64-3.7\pysqlcipher3\dump.py -> build\bdist.win-amd64\egg\pysqlcipher3
    22. creating build\bdist.win-amd64\egg\pysqlcipher3\test
    23. creating build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    24. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\dbapi.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    25. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\dump.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    26. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\factory.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    27. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\hooks.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    28. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\regression.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    29. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\sqlcipher.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    30. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\transactions.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    31. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\types.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    32. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\userfunctions.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    33. copying build\lib.win-amd64-3.7\pysqlcipher3\test\python3\__init__.py -> build\bdist.win-amd64\egg\pysqlcipher3\test\python3
    34. copying build\lib.win-amd64-3.7\pysqlcipher3\test\__init__.py -> build\bdist.win-amd64\egg\pysqlcipher3\test
    35. copying build\lib.win-amd64-3.7\pysqlcipher3\_sqlite3.cp37-win_amd64.pyd -> build\bdist.win-amd64\egg\pysqlcipher3
    36. copying build\lib.win-amd64-3.7\pysqlcipher3\__init__.py -> build\bdist.win-amd64\egg\pysqlcipher3
    37. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\dbapi2.py to dbapi2.cpython-37.pyc
    38. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\dump.py to dump.cpython-37.pyc
    39. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\dbapi.py to dbapi.cpython-37.pyc
    40. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\dump.py to dump.cpython-37.pyc
    41. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\factory.py to factory.cpython-37.pyc
    42. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\hooks.py to hooks.cpython-37.pyc
    43. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\regression.py to regression.cpython-37.pyc
    44. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\sqlcipher.py to sqlcipher.cpython-37.pyc
    45. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\transactions.py to transactions.cpython-37.pyc
    46. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\types.py to types.cpython-37.pyc
    47. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\userfunctions.py to userfunctions.cpython-37.pyc
    48. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\python3\__init__.py to __init__.cpython-37.pyc
    49. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\test\__init__.py to __init__.cpython-37.pyc
    50. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\__init__.py to __init__.cpython-37.pyc
    51. creating stub loader for pysqlcipher3\_sqlite3.cp37-win_amd64.pyd
    52. byte-compiling build\bdist.win-amd64\egg\pysqlcipher3\_sqlite3.py to _sqlite3.cpython-37.pyc
    53. creating build\bdist.win-amd64\egg\EGG-INFO
    54. copying pysqlcipher3.egg-info\PKG-INFO -> build\bdist.win-amd64\egg\EGG-INFO
    55. copying pysqlcipher3.egg-info\SOURCES.txt -> build\bdist.win-amd64\egg\EGG-INFO
    56. copying pysqlcipher3.egg-info\dependency_links.txt -> build\bdist.win-amd64\egg\EGG-INFO
    57. copying pysqlcipher3.egg-info\top_level.txt -> build\bdist.win-amd64\egg\EGG-INFO
    58. writing build\bdist.win-amd64\egg\EGG-INFO\native_libs.txt
    59. zip_safe flag not set; analyzing archive contents...
    60. pysqlcipher3.__pycache__._sqlite3.cpython-37: module references __file__
    61. creating dist
    62. creating 'dist\pysqlcipher3-1.0.3-py3.7-win-amd64.egg' and adding 'build\bdist.win-amd64\egg' to it
    63. removing 'build\bdist.win-amd64\egg' (and everything under it)
    64. Processing pysqlcipher3-1.0.3-py3.7-win-amd64.egg
    65. creating d:\work\python37\lib\site-packages\pysqlcipher3-1.0.3-py3.7-win-amd64.egg
    66. Extracting pysqlcipher3-1.0.3-py3.7-win-amd64.egg to d:\work\python37\lib\site-packages
    67. Adding pysqlcipher3 1.0.3 to easy-install.pth file
    68. Installed d:\work\python37\lib\site-packages\pysqlcipher3-1.0.3-py3.7-win-amd64.egg
    69. Processing dependencies for pysqlcipher3==1.0.3
    70. Finished processing dependencies for pysqlcipher3==1.0.3

    中间过程如果执行有差错,可以clean一下再重试

    1. D:\MyDocs\Desktop\pysqlcipher3>python setup.py clean

测试

至此pysqlcipher3编译安装完毕,写个程序测试一下:

  1. from pysqlcipher3 import dbapi2 as sqlite
  2. conn1 = sqlite.connect("test.db")
  3. c1 = conn1.cursor()
  4. c1.execute("PRAGMA key='123456'")
  5. c1.execute("""create table stocks (date text, trans text, symbol text, qty real, price real)""")
  6. c1.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")
  7. conn1.commit()
  8. c1.close()
  9. conn2 = sqlite.connect("test.db")
  10. c2 = conn2.cursor()
  11. c2.execute("PRAGMA key='123456'")
  12. print(c2.execute("""select * from stocks""").fetchall())
  13. c2.close()

结果

  1. D:\work\Python37\python.exe C:/Users/caipi/IdeaProjects/wechat_db_decrypt/test.py
  2. [('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)]
  3. Process finished with exit code 0

也可能执行失败,提示

  1. D:\work\Python37\python.exe C:/Users/caipi/IdeaProjects/wechat_db_decrypt/test.py
  2. Traceback (most recent call last):
  3. File "C:/Users/caipi/IdeaProjects/wechat_db_decrypt/test.py", line 1, in <module>
  4. from pysqlcipher3 import dbapi2 as sqlite
  5. File "D:\work\Python37\lib\site-packages\pysqlcipher3-1.0.3-py3.7-win-amd64.egg\pysqlcipher3\dbapi2.py", line 33, in <module>
  6. from pysqlcipher3._sqlite3 import *
  7. ImportError: DLL load failed: 找不到指定的模块。

最有可能的原因是上面提到的 OpenSSL 问题,没有拷贝到 Windows 系统目录,或者没有将 OpenSSL-Win64\bin 目录增加到环境变量PATH。

关于sqlcipher版本问题

编译完成后,自己测试创建一个db再读取没问题,但可能打开其他现成的加密db会失败,提示file is not a database,实际错误是解密失败,最大的可能性是我们clone的sqlcipher当前是4.x版本,而要打开的db是由3.x版本创建的。

参考SQLCipher 4的更新说明

SQLCipher Core

  • Default page size for databases increased to 4096 bytes (up from 1024)
  • Default PBKDF2 iterations increased to 256,000 (up from 64,000)
  • Default KDF algorithm is now PBKDF2-HMAC-SHA512 (from PBKDF2-HMAC-SHA1)
  • Default HMAC algorithm is now HMAC-SHA512 (from HMAC-SHA1)
  • ...

使用最新版本的DB Browser for SQLCipher也无法打开测试代码创建的test.db,原因也是如此
image.png-38.3kB

想要使用Python打开sqlcipher3版本的数据库,可以在调用代码里指定加密算法

  1. ...
  2. cur.execute("PRAGMA cipher_page_size = 1024")
  3. cur.execute("PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1")
  4. cur.execute("PRAGMA cipher_hmac_algorithm = HMAC_SHA1")
  5. ...

如果完全不需要sqlcipher4的支持,可以在第5步时指定切换到sqlcipher3编译(目前最新的是3.4.2版本):

  1. D:\MyDocs\Desktop>git clone https://github.com/sqlcipher/sqlcipher.git
  2. D:\MyDocs\Desktop>git checkout tags/v3.4.2

这样生成的test.db也可以用DB Browser for SQLCipher来打开编辑了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注