【问题标题】:OpenSSL and M2crypto not working together on OS X MavericksOpenSSL 和 M2crypto 无法在 OS X Mavericks 上协同工作
【发布时间】:2013-11-01 23:42:46
【问题描述】:

当我尝试使用 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 版本符号链接到默认值,但没有运气。有什么想法吗?

【问题讨论】:

  • 您是在使用 Apple 预装的 Python 2.7.5,还是从 Python.org 安装了一个额外的,或者使用 Homebrew 或类似工具构建了一个?
  • 另外,这是您从 10.8 升级到 10.9 的机器吗?如果是这样,您是否在升级之前酿造或以其他方式构建了这些部分?
  • 这是一台升级的机器,我认为它是苹果预装的 Python 2.7。所有这些都在 virtualenv 中进行。升级到 10.9 后,所有自制软件都已完成。
  • 不要只假设你有哪个 Python;如果有任何机会存在第三方 Python,则在 virtualenv 中 ls -l .Python 并确保它指向 /System 下的内容。

标签: python openssl osx-mavericks m2crypto


【解决方案1】:

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

查看 OpenSSL @https://github.com/mxcl/homebrew/blob/master/Library/Formula/openssl.rb 的 Brew 配方,您构建的 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. 通过导出 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 这样古老的东西,它可能需要它。

【讨论】:

  • 针对技巧一:这是输出:/Users/user/.python-eggs/M2Crypto-0.21.1-py2.7-macosx-10.9-intel.egg-tmp/M2Crypto/__m2crypto.so (for architecture x86_64): Mach-O 64-bit bundle x86_64 /Users/user/.python-eggs/M2Crypto-0.21.1-py2.7-macosx-10.9-intel.egg-tmp/M2Crypto/__m2crypto.so (for architecture i386): Mach-O bundle i386 在我看来,i386 和 x86_64 都有二进制文件。
  • 我们也只将 M2Crypto 用于遗留系统......我希望我们不必包含它。此外,不需要更新版本的 OpenSSL(通过 brew),但一位同事认为这可能是解决我们遇到的错误的一种方法。
  • @wegry:我相信 synthesizerpatel 的观点是 Homebrew OpenSSL 不是通用的,因此您最终构建了针对 Apple 的 OpenSSL(或者更糟糕的是,针对 Homebrew 进行编译但链接反对苹果)。 file /usr/local/lib/libssl.dylib (并按照符号链接指向地窖某处的真实 .x.y.z.dylib),还有 otool -L __m2crypto.so 文件(查看它与什么链接)。跨度>
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2013-11-01
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多