如何在OSX上让Python加载dylib

8

在OSX的单元测试中尝试从当前'.'目录加载共享库。

在Linux和Netbsd上,有一个符号链接_mymodule.so --> ../.libs/libmymodule.so是可行的。

但是在OSX上,Python的import mymodule无法找到。

_mymodule.dylib --> ../.libs/libmymodule.dylib

我尝试添加

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

对于脚本环境,不起作用。欢迎任何帮助。

-Ed

更新于4/6/10:

从krunk那里得到的信息解决了问题。但是仅仅复制或ln -s将dylib命名为.so并不能完全解决它。仍然无法加载。但是使用-module标志告诉libtool链接库创建了一个可以加载的.so库。现在该库的Python版本可以工作了。

现在如果我能让perl库工作就好了。我正在构建swig perl、python、ruby和lua库,而这个修复只让python和lua工作了。

1个回答

14

在OS X中,也可以将模块扩展名使用*.so。我有一个模糊的记忆,无法加载.dylib并且它最终变成了与Python本身有关的问题...但是我现在找不到邮件列表帖子了。

但是,请放心,即使在OS X上也通过使用*.so遵循标准实践。整个框架中仅有的*.dylib是libsvn_swig。

find /System/Library/Frameworks/Python.framework/Versions/2.6/ -name "*.so"

/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/X11/xcb/xcb.0.0.0.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/X11/xcb/xcb.0.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/X11/xcb/xcb.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/CoreGraphics/_CoreGraphics.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/OpenSSL/SSL.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/OpenSSL/crypto.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/OpenSSL/rand.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_appmain.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_carbon.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_inlines.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_nsbezierpath.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_nsbitmap.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_nsfont.so
 /System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_nsquickdrawview.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_nsview.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/AppKit/_nswindow.so
/System/Library/Frameworks/Python.framework/Versions/2.6//Extras/lib/python/PyObjC/CFNetwork/_manual.so

谢谢!你的答案帮我摆脱了困境,并且让我朝着正确方向迈进了很长一步。 - navicore
2
作为一种预防措施,在OS X中永远不要使用静态库。它们已经“弃用”,并且在可能的情况下,即使您明确链接到静态库,OSX也将始终链接动态库。例如,如果您链接到/path/to/libfoo.a,并且路径中任何地方都存在libfoo.dylib或libfoo.so,则链接器将轻松忽略您的请求,导致一些非常有趣的运行时未定义符号错误,如果两个表格不同。 - jkyle
我会说Python中的错误代码是https://github.com/python/cpython/blob/2ebc5ce42a8a9e047e790aefbf9a94811569b2b6/Python/dynload_shlib.c#L36 - Mizux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接