2014-10-06 109 views
0

我有一个使用Ogre3D通过C++包装器模块编写的Python应用程序。当试图运行我的应用程序我可以设置Python的@executable_path

python /path/to/myapp.py 

我得到的错误

的dlopen(./ MyOgreWrapper.so,2):库未加载: @executable_path /../框架/ Ogre.framework /path/to/MyOgreWrapper.so原因:/Versions/1.9.0/Ogre 从引用没有找到图片

我从那里MyOgreWrapper.so所在的目录中运行它,这样MyOgreWrapper.so能被Python找到。 Ogre.framework位于../Frameworks相对于MyOgreWrapper.so的位置。

$otool -l MyOgreWrapper.so 
MyOgreWrapper.so: 
@rpath/MyOgreWrapper.so (compatibility version 0.0.0, current version 0.0.0) 
@executable_path/../Frameworks/Ogre.framework/Versions/1.9.0/Ogre (compatibility version 1.9.0, current version 1.9.0) 
... 

我怀疑发生这种情况是因为@executable_path设置为python可执行文件的路径。

有没有办法从Python设置环境,使@executable_path是当前目录?我知道如果我在MyOgreWrapper.so中改变Ogre的路径和其他一些依赖于@loader_path的路径,所有这些都将工作,但这不是它是如何从盒子出来的,我宁愿不必)

+0

我认为[这](http://stackoverflow.com/questions/4934806/python-how-to-find-scripts-directory)是你在找什么。 – Travis 2014-10-06 23:12:17

回答

0

不,从可执行文件中无法控制@executable_path@executable_path由动态加载程序dyld解决,它使用它加载的可执行文件的路径。它对任何给定的可执行文件都是固定另外,如果你可以改变它,那可能会破坏进程试图加载的其他东西。

+0

谢谢。我通过在Ogre构建脚本中将\ @executable_path更改为\ @rpath来修复它。奇怪的是,它直到昨天才正常工作。我能想到的唯一的事情可能已经打破了它将CMake更新到3.0.2。 – glennr 2014-10-07 02:06:27