如何使用自制程序中的 openSSL 在 macOS 上编译 Python 3.6.2?

2023-11-23

我正在尝试根据 macOS 10.11 上的说明编译 Python 3.6.2https://bugs.python.org/issue29095.

我使用自制程序将 openSSL 安装到标准位置,然后将 LDFLAGS、CFLAGS 和 CPPFLAGS 添加到我的环境中:

$ printenv | grep FLAGS
LDFLAGS=/usr/local/Cellar/openssl/1.0.2l/lib/
CFLAGS=-I/usr/local/Cellar/openssl/1.0.2l/include/openssl
CPPFLAGS=-I/usr/local/Cellar/openssl/1.0.2l/include/openssl

然后在同一个 shell 中,我将 Python 编译到我的用例所需的自定义位置:

$ sudo ./configure --prefix=/oebuild/python/python-3.6.1
$ sudo make
$ sudo make install

但是,SSL 模块并未构建。构建日志是这样说的:

Python构建成功完成! 未找到构建这些可选模块所需的位: _gdbm _ssl ossaudiodev
spwd
要查找必要的位,请在 detector_modules() 中的 setup.py 中查找模块名称。


我之前找到的以前的答案都不适合我,但我最终在之前未提到的另一个答案的帮助下找到了答案。这是实际的修复:https://stackoverflow.com/a/20740964/2934226

CPPFLAGS 和 LDFLAGS 基本上不能在环境中设置;您需要将它们与配置命令一起设置,如下所示:

./configure CPPFLAGS="-I[openSSL install location]/include" LDFLAGS="-L[openSSL install location]/lib" [other flags here]

然后编译安装后,就成功了!

$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2l  25 May 2017

以下是不起作用的事情以及原因:

如何使用自定义 OpenSSL 编译 Python 3.4?没有帮助,因为您无法在环境中设置 LDFLAGS、CFLAGS 或 CPPFLAGS; setup.py 不会将它们传递到实际的编译步骤。即使设置 LD_LIBRARY_PATH 可能有效,您也不想这样做,因为它很危险(请参阅http://xahlee.info/UnixResource_dir/_/ldpath.html)。最后, --with-ssl 不是有效的配置参数,并且其中列出的用于添加它的补丁不能完全应用。

Homebrew 拒绝链接 OpenSSL当您尝试从源代码构建某些内容,而不是尝试获取已编译的 dylib 来查找重新定位的库时,则不适用。此外,在 /usr/local 中创建符号链接是危险的,并且可能导致程序针对较新的标头进行编译,但使用较旧的系统二进制文件。

如何在 MacOS 上的 python 构建中包含 ssl无法正常工作。编辑 setup.py 以添加 lib 并包含安装 openSSL 的目录部分地有效,并允许您在 SSL 支持中进行编译。唉,它们不可导入,因为旧版本仍在使用:

Following modules built successfully but were removed because they could not be imported:
_hashlib              _ssl                                    

[...]

building '_ssl' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -I/usr/local/opt/openssl/include/ -I./Include -I/oebuild/python/python-3.6.1/include -I. -I/usr/local/include -I/oebuild/python/src/Python-3.6.1/Include -I/oebuild/python/src/Python-3.6.1 -c /oebuild/python/src/Python-3.6.1/Modules/_ssl.c -o build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_ssl.o
gcc -bundle -undefined dynamic_lookup build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_ssl.o -L/oebuild/python/python-3.6.1/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so
building '_hashlib' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -I/usr/local/opt/openssl/include/ -I./Include -I/oebuild/python/python-3.6.1/include -I. -I/usr/local/include -I/oebuild/python/src/Python-3.6.1/Include -I/oebuild/python/src/Python-3.6.1 -c /oebuild/python/src/Python-3.6.1/Modules/_hashopenssl.c -o build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_hashopenssl.o
gcc -bundle -undefined dynamic_lookup build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_hashopenssl.o -L/oebuild/python/python-3.6.1/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so
*** WARNING: renaming "_ssl" since importing it failed: dlopen(build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so, 2): Symbol not found: _CRYPTO_THREADID_set_callback
  Referenced from: build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so
  Expected in: flat namespace
 in build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so
*** WARNING: renaming "_hashlib" since importing it failed: dlopen(build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so, 2): Symbol not found: _HMAC_CTX_copy
  Referenced from: build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so
  Expected in: flat namespace
 in build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so

otool -L显示问题:

$ otool -L build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin_failed.so 
build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin_failed.so:
    /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

(CRYPTO_THREADID是在1.0.0版本中引入的,根据https://wiki.openssl.org/index.php/Manual:Threads(3)#HISTORY)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用自制程序中的 openSSL 在 macOS 上编译 Python 3.6.2? 的相关文章

随机推荐