因此,尽管
pip install pysqlcipher3
工作返回
Successfully installed pysqlcipher3
,但没有。
根据我的研究,这似乎是Windows用户尝试安装Sqlcipher的常见问题。
尝试#1
首先,我尝试从github下载pysqlcipher3并通过cmd手动构建和安装它(使用
python setup.py build
和
python seetup.py install
)。
执行时
python3 setup.py build
我遇到了一些错误(缺少一些要求,环境变量中没有OPENSSL_CONF。 ..等),但我修复了其中的大部分。
但是,我最终遇到了这个错误:
fatal error C1083: Cannot open include file: 'sqlcipher/sqlite3.h': No such file or directory
尝试#2
我在某个地方读到(我认为)我必须安装 SQLCipher 在安装 PySqlCipher3 之前。
经过检查,我发现我必须付费才能获得预构建可执行文件或自己构建它。
所以我尝试了按照本教程自己构建它 安装所有要求并按照步骤操作后,我遇到了另一个死胡同。在最后一步(第 6 步)中,执行时
我收到此错误:
nmake /f Makefile.msc
我的问题是:
fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory
我读到我需要
-
这可能是问题所在。我在哪里可以找到它(首选链接到可执行文件)。
libsqlcipher
我如何解决我的 - 第一次尝试中的问题 ? 我如何解决我的
- 第二次尝试中的问题|| |? 我的目标: 安装并运行 pysqlcipher3。
编辑 1 - 解决了尝试 #2 只是为了达到另一个问题 所以看来我缺少一些 C++ 功能和工具视觉工作室。因此,通过 Visual Studio Community 安装程序,我下载并安装了基本的 C++ 内容,它修复了错误。
我遇到了另一个错误,我通过将
文件夹复制到
来修复该错误。
OpenSSL-Win64\include
但是,现在我陷入了困境出现此错误:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include
.
However, now I am stuck with this error:
sqlite3.c(77701): warning C4389: '!=': signed/unsigned mismatch
lib.exe /NOLOGO /MACHINE:x64 /OUT:libsqlite3.lib sqlite3.lo
echo EXPORTS > sqlcipher.def
dumpbin /all libsqlite3.lib | tclsh .\tool\replace.tcl include "^\s+1 _?(sqlite3(?:session|changeset|changegroup|rebaser)?_[^@]*)(?:@\d+)?$" \1 | sort >> sqlcipher.def
link.exe /DEBUG /NOLOGO /MACHINE:x64 /DLL /DEF:sqlcipher.def /OUT:sqlcipher.dll sqlite3.lo sqlite3res.lo
Creating library sqlcipher.lib and object sqlcipher.exp
sqlite3.lo : error LNK2019: unresolved external symbol RAND_bytes referenced in function sqlcipher_openssl_random
sqlite3.lo : error LNK2019: unresolved external symbol RAND_add referenced in function sqlcipher_openssl_add_random
sqlite3.lo : error LNK2019: unresolved external symbol OBJ_nid2sn referenced in function sqlcipher_openssl_get_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_MD_size referenced in function sqlcipher_openssl_get_hmac_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_nid referenced in function sqlcipher_openssl_get_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_block_size referenced in function sqlcipher_openssl_get_block_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_key_length referenced in function sqlcipher_openssl_get_key_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_iv_length referenced in function sqlcipher_openssl_get_iv_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CipherInit_ex referenced in function sqlcipher_openssl_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CipherUpdate referenced in function sqlcipher_openssl_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CipherFinal_ex referenced in function sqlcipher_openssl_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_CTX_new referenced in function sqlcipher_openssl_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_CTX_free referenced in function sqlcipher_openssl_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_CIPHER_CTX_set_padding referenced in function sqlcipher_openssl_cipher
sqlite3.lo : error LNK2019: unresolved external symbol EVP_sha1 referenced in function sqlcipher_openssl_get_hmac_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_sha256 referenced in function sqlcipher_openssl_get_hmac_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_sha512 referenced in function sqlcipher_openssl_get_hmac_sz
sqlite3.lo : error LNK2019: unresolved external symbol EVP_get_cipherbyname referenced in function sqlcipher_openssl_activate
sqlite3.lo : error LNK2019: unresolved external symbol PKCS5_PBKDF2_HMAC referenced in function sqlcipher_openssl_kdf
sqlite3.lo : error LNK2019: unresolved external symbol HMAC_CTX_new referenced in function sqlcipher_openssl_hmac
sqlite3.lo : error LNK2019: unresolved external symbol HMAC_CTX_free referenced in function sqlcipher_openssl_hmac
sqlite3.lo : error LNK2019: unresolved external symbol HMAC_Init_ex referenced in function sqlcipher_openssl_hmac
sqlite3.lo : error LNK2019: unresolved external symbol HMAC_Update referenced in function sqlcipher_openssl_hmac
sqlite3.lo : error LNK2019: unresolved external symbol HMAC_Final referenced in function sqlcipher_openssl_hmac
sqlcipher.dll : fatal error LNK1120: 24 unresolved externals
错误信息显示链接器在
sqlite3.lo
中找不到 OpenSSL 库中定义的多个函数,例如
RAND_bytes
、
EVP_CipherInit_ex
等。这意味着需要在构建过程中链接 OpenSSL 库。
以下是解决此问题的步骤:
1. 确认 OpenSSL 库文件的位置:
确保已成功构建或下载了 OpenSSL 库,并且
libcrypto.lib
和
libssl.lib
文件位于系统的已知位置。
2. 更新
Makefile.msc
文件:
需要修改构建 SQLCipher 时使用的
Makefile.msc
文件,以包含 OpenSSL 库路径和链接器标志。
-
添加 OpenSSL 库路径:
-
找到
Makefile.msc
文件中的LFLAGS
部分。 -
在
LFLAGS
中添加 OpenSSL 库目录路径。例如,如果 OpenSSL 库文件位于C:\openssl-1.1.1k\lib
,则添加以下行:LFLAGS=/LIBPATH:"C:\openssl-1.1.1k\lib"
-
找到
-
链接 OpenSSL 库文件:
-
在
Makefile.msc
文件中的LFLAGS
部分中,添加以下内容来链接libcrypto.lib
和libssl.lib
:LFLAGS=/LIBPATH:"C:\openssl-1.1.1k\lib" libcrypto.lib libssl.lib
-
在
3. 清理并重新构建 SQLCipher:
在
Makefile.msc
中进行更改后,需要清理之前的构建文件并重新构建 SQLCipher。在命令提示符中,导航到 SQLCipher 源代码目录并运行以下命令:
nmake clean
nmake
这将使用更新的
Makefile.msc
设置重新构建 SQLCipher,并将 OpenSSL 库链接到生成的
sqlcipher.dll
文件中。
4. 安装 PySqlCipher3:
成功构建 SQLCipher 后,可以尝试再次安装
pysqlcipher3
。
pip install pysqlcipher3
这次安装应该能够找到并链接所需的 OpenSSL 库,从而解决链接错误。
如果问题仍然存在:
-
确保的环境变量
PATH
中包含 OpenSSL 库目录的路径,以便系统可以找到libcrypto.dll
和libssl.dll
文件。 - 检查 Visual Studio 项目设置,确认链接器选项中包含了 OpenSSL 库目录和文件。
希望这些步骤可以帮助解决问题并成功安装
pysqlcipher3
!