7

因此,即使pip install pysqlcipher3工作返回Successfully installed pysqlcipher3,它也没有。

根据我的研究,对于尝试安装 Sqlcipher 的 Windows 用户来说,这似乎是一个常见问题。

尝试#1

首先,我尝试从 github 下载 pysqlcipher3 并通过 cmd 手动构建和安装它(使用python setup.py buildand 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

我在某处(我认为)读到我必须在安装PySqlCipher3之前安装SQLCipher

经过检查,我发现我必须付费才能获得预构建可执行文件或自己构建它。

所以我尝试按照本教程自己构建它。

安装完所有要求并按照步骤操作后,我到达了另一个死胡同。在最后一步之前(第 6 步),执行时nmake /f Makefile.msc出现此错误:

fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory


我的问题是:

  1. 我读到我需要libsqlcipher这可能是问题所在。我在哪里可以找到它(首选可执行文件的链接)。
  2. 我如何在第一次尝试时解决这个问题?
  3. 如何在第二次尝试中解决该问题?

我的目标是:安装并运行 pysqlcipher3。


编辑 1 - 解决了尝试 #2 只是为了解决另一个问题

因此,我似乎在 Visual Studio 中缺少一些 C++ 功能和工具。因此,通过 Visual Studio 社区安装程序,我下载并安装了基本的 C++ 东西,它修复了错误。

我遇到了另一个错误,我通过将OpenSSL-Win64\include文件夹复制到C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include.

但是,现在我遇到了这个错误:

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
4

3 回答 3

3

首先,"Successfully installed pysqlcipher3"具有误导性(至少直到Github 存储库上的当前最新提交 fd1b547407bcb7198107fe3c458105286a060b0d)。我刚刚浪费了自己的一些时间,并认为我应该再次澄清一下。

这种误导"Successfully installed pysqlcipher3"也出现在 Linux 系统上。如果您手边有一个 Ubuntu/Debian 系统,那么以下内容将助您一臂之力。基本上你需要在命令SQLCipher之前安装库和开发文件。pip3

$ sudo apt install sqlcipher libsqlcipher0 libsqlcipher-dev
$ sudo -H pip3 install pysqlcipher3

$ python3 -c 'import pysqlcipher3; print(pysqlcipher3.__path__)'
['/usr/local/lib/python3.7/dist-packages/pysqlcipher3']

由于您在 Windows 上,unresolved external symbol RAND_bytes(编译器/链接器错误的第一行)基本上意味着您在 Windows 上的链接器找不到必要的OpenSSL库。

看看这里这里这里的帖子。他们对这个确切的 OpenSSL 链接问题有解决方案。解决问题的基本步骤如下:

  1. 从此处下载并安装所需的 32/64 位版本的 OpenSSL
  2. 使 Visual Studio 使用OpenSSL 包含目录,例如C:\OpenSSL-Win32\include
  3. 使 Visual Studio 使用OpenSSL 目录,例如C:\OpenSSL-Win32\lib
  4. 在 Visual Studio 中添加以下库作为附加链接器依赖项:
    - libeay32.lib
    - libeay32MTd.lib
    - libeay32MT.lib
    - libeay32MDd.lib
    - libeay32MD.lib
    - ssleay32.lib
    - ssleay32MTd.lib
    - ssleay32MT.lib
    - ssleay32MDd.lib
    - ssleay32MD.lib
于 2019-10-17T06:13:58.343 回答
3

我也遇到了几乎所有你的问题,所以我在下面创建了这个对我有用的指南

我的构建:Windows 10 x64 v1909

  1. 安装 python(如果尚未安装)。我有 v3.7 64 位
  2. 安装Win64OpenSSL-1_0_2u。确保你得到的是这个版本,因为我第一次下载了一些其他版本并且它们不起作用。
  3. 为用户和系统添加环境变量SET OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg(根据您的更改路径)
  4. 安装ActiveTcl-8.6.9.8609.2-MSWin32-x64。这是当时最新的并且有效
  5. 安装 Visual Studio(如果尚未安装)。我有 VS2019 v16.5.5
  6. 获取sqlcipher并解压到目录
  7. 打开 Visual Studio x64 本机工具并导航到上面提取的目录sqlcipher
  8. 运行命令nmake /f Makefile.msc。最后编译会报错,不过没关系,我们这里不需要真正的编译,只需要sqlite3.c
  9. 获取pysqlcipher3-1.0.3,解压到目录并导航到它
  10. 创建以其中命名的文件夹amalgamation并创建另一个以文件夹命名sqlcipheramalgamation文件夹
  11. 在 Visual Studio 步骤(在文件夹中)复制sqlite3.h并创建到文件夹和文件夹sqlite3.csqlcipher-masteramalgamationsqlcipher
  12. 打开管理命令提示符并导航到上面提取的目录pysqlcipher3-1.0.3
  13. 运行以下命令python setup.py build_amalgamation
  14. 正如 OP 所说,这将给出链接错误。现在安装Win32OpenSSL-1_0_2u。之前您安装了 x64,现在安装了 x32。我在多次失败后学会了这个技巧-:)
  15. 调整 SSL 的环境变量以指向 x32 安装位置,而不是像第 3 点中所做的那样指向 x64
  16. 关闭并重新打开 admin CMD 并重新键入命令python setup.py build_amalgamation。这次它应该可以正常工作,没有任何错误。
  17. 现在运行以下命令python setup.py install
  18. 如果一切顺利,那么这个命令应该可以在 cmd>>python>>from pysqlcipher3 import dbapi2

一些对我有用的链接1 , 2 , 3 , 4 , 5

如果由于将来链接断开而无法获得与我相同的确切版本,您可以发表评论,如果当时我有它们,我将上传到云驱动器。

[2021 年 4 月 27 日更新 Python v3.9.4 x64]

  1. 我尝试对 Python v3.9.4 x64 重复上述步骤,但由于以下两个原因,发生了更多错误

    1.1。MODULE_NAME正如@ProfP30 在评论中指出的那样,在编译时间之前未正确解析宏。错误将如下:

    src\python3\cache.c(261): 错误 C2017: 非法转义序列

    1.2. 由于在 python 3.9 版中删除了某些函数的功能

  2. 对于第一个问题,由于宏是预处理器指令(从 setup.py 文件提供给 cl.exe 编译器),因此可以通过一种解决方法来消除错误,方法是将所有出现的 this 替换为合适的替换。对于我的系统配置,我替换了解决问题MODULE_NAME的文件夹中的所有出现pysqlcipher3-1.0.4/src/python3pysqlcipher3.dbapi2

  3. 对于第二个问题,解决方案是手动提供从 Python v>3.8 中删除的所有函数的替换。这对我来说很烦人。幸运的是,pysqlcipher3 1.0.4几天前刚刚发布(21 年 4 月 25 日)已经解决了这个问题并提供了替代品。因此,更好的是使用源文件pysqlcipher3 1.0.4而不是pysqlcipher3 1.0.3上面第 9 点中所做的那样。

  4. 为了避免编译 pysqlcipher3 的所有这些麻烦,我在此链接上放置了 Python v3.9.4 x64 的预编译二进制文件以及说明。(免责声明:由于存储限制,该链接将来可能会被删除。)

于 2020-05-19T08:49:16.823 回答
3

在运行 Catalina macOS 10.15.4 的 iMac 上,当我尝试安装 pysqlcipher3 时,它会吐出错误消息

但后来我跑了

$ brew install SQLCipher

成功地工作:

$ brew install SQLCipher
==> Downloading https://homebrew.bintray.com/bottles/sqlcipher-4.4.0.catalina.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/9e/9e860b50ec668ef30f61377f39954241c4eeda4c4a664fbe1340e289229336bf?__gda__=exp=1590256907~hmac=9bb692e78355e890ab
######################################################################## 100.0%
==> Pouring sqlcipher-4.4.0.catalina.bottle.tar.gz
  /usr/local/Cellar/sqlcipher/4.4.0: 13 files, 3.9MB

现在,当我第二次尝试安装 pysqlcipher3 时,它也安装成功:

$ pip3 install pysqlcipher3
Collecting pysqlcipher3
  Using cached pysqlcipher3-1.0.3.tar.gz (100 kB)
Building wheels for collected packages: pysqlcipher3
  Building wheel for pysqlcipher3 (setup.py) ... done
  Created wheel for pysqlcipher3: filename=pysqlcipher3-1.0.3-cp37-cp37m-macosx_10_15_x86_64.whl size=61077 sha256=28e480d5999a13cf2446a262cff9d746853d0bf90541a76e473f66a7128ff877
  Stored in directory: /Users/kitzume/Library/Caches/pip/wheels/91/30/b9/1ee85dc50cddf37ecb5198dfa6279aa72eeb0148063b5ad0c6
Successfully built pysqlcipher3
Installing collected packages: pysqlcipher3
Successfully installed pysqlcipher3-1.0.3
于 2020-05-23T17:58:19.507 回答