2

当我尝试使用 Python 2.7.5 导入 M2crypto 时,出现以下错误

ImportError: dlopen(/Users/user/.python-eggs/M2Crypto-0.21.1-py2.7-macosx-10.9-intel.egg-tmp/M2Crypto/__m2crypto.so, 2): Symbol not found: _PEM_read_bio_SSL_SESSION Referenced from: /Users/user/.python-eggs/M2Crypto-0.21.1-py2.7-macosx-10.9-intel.egg-tmp/M2Crypto/__m2crypto.so Expected in: flat namespace in /Users/user/.python-eggs/M2Crypto-0.21.1-py2.7-macosx-10.9-intel.egg-tmp/M2Crypto/__m2crypto.so

我使用 brew 安装 OpenSSL,但我感觉这是导致错误的原因。我还尝试将 OpenSSL 的 brew 版本符号链接到默认值,但没有运气。有任何想法吗?

4

1 回答 1

2

一些帮助、建议、对错误的解释,但可能不是完整的答案:

查看 OpenSSL 的 Brew 配方 @ https://github.com/mxcl/homebrew/blob/master/Library/Formula/openssl.rb,您构建的 OpenSSL 似乎很可能只有 64 位。在为 Python 构建扩展时,如果您针对 OS 默认 Python 构建,它通常仅在您构建通用二进制文件 (i386+x86_64) 时才能正常工作

OSX 默认在 10.9 SDK 中提供 OpenSSL,您可以安全地构建它,但如果您需要更新的 OpenSSL,可能会导致一些问题。

调试这个的几个技巧:

  1. 运行 'file /Users/user/.python-eggs/M2Crypto-0.21.1-py2.7-macosx-10.9-intel.egg-tmp/M2Crypto/__m2crypto.so' 以了解您的库是如何构建的。我敢打赌它只会说 x86_64 共享库,而不是胖共享库(i386 + x86_64)

  2. 通过 export DYLD_INSERT_LIBRARIES=/usr/local/lib/$WHATEVER_LIBOPENSSLS_FILENAME_IS 将您的 OpenSSL 库添加到共享库预加载列表

其他一些想法 - 'expected in flat namespace' 问题通常通过在编译时传递 ld -flat_namespace 来解决。这应该默认发生,如果不是 - 这有点奇怪。自 10.5 或 10.6 以来,这一直不是 OSX 上的 Python 的“标准”问题。

M2Crypto 没有看到很多活动,最后一次提交是在 2011 年。我个人会根据您的需要切换到不同的加密库。

- - 编辑 - -

试试这个,做一个 make distclean (或 make clean,无论哪个)

然后试试这个:

只需将此 blob 剪切并粘贴到“make”的末尾 - 这是一个命令:

SDK_DIR="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/" \
LDFLAGS="-isysroot ${SDK_DIR}" \
CPPFLAGS="-I${SDK_DIR}/usr/include -isysroot ${SDK_DIR}" \
CFLAGS="-I${SDK_DIR}/usr/include -isysroot ${SDK_DIR}" \
./configure && make

如果这不起作用,请将以下标志添加到 CFLAGS 和 LDFLAGS

-flat_namespace -undefined suppress

再试一次?我很确定你不应该再使用这些标志中的任何一个,但对于像 M2Crypto 这样古老的东西,它可能需要它。

于 2013-11-02T08:51:40.263 回答