Python runtime_library_dirs doesn't work on Mac

≡放荡痞女 提交于 2019-11-30 13:04:22

问题


I have a Python extension module that needs to link against some dynamic libraries at runtime, so I need to tell it where to look for them. I'm doing this by specifying runtime_library_dirs in my setup.py. This works fine on Linux, but seems to have no effect on Mac. I get an ImportError when I try to import my module, and the only way I've found to make it go away is to add the library directory to DYLD_LIBRARY_PATH before starting python. What do I need to do to make this work?


回答1:


I finally figured this out. The solution has two parts. First, setup.py needs to use extra_link_args to tell the linker to add a correct rpath to the compiled module:

if platform.system() == 'Darwin':
    extra_link_args.append('-Wl,-rpath,'+lib_path)

where lib_path is the directory where the libraries are installed. Second, all of the libraries you're linking against must have install names that begin with "@rpath/". For example, if a library is called "libFoo.dylib", its install name should be "@rpath/libFoo.dylib". You can use "install_name_tool -id" to change the install name of a library.




回答2:


You can tell what libraries an extension links against with

otool -L pyext.so

I had a problem where an extension was linking to the wrong version of a library on my system. In that case I used install_name_tool to change the path to the library directly. For example,

install_name_tool -change /wrong/libfoo.dylib /right/libfoo.dylib pyext.so


来源:https://stackoverflow.com/questions/19123623/python-runtime-library-dirs-doesnt-work-on-mac

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!