操作系统是 MacOS X,特别是 PowerPC G4 上的 10.5 (Leopard),但我在运行 10.6 的 x86 上遇到了同样的问题。
我正在编写一个动态加载 DLL 的应用程序。DLL(我们称它为foo.dylib)是另一个应用程序的一部分,位于硬盘的其他位置;我的应用程序foo.dylib以编程方式找到(确切的位置可能会改变,可能用户通过 GUI 从正在运行的应用程序本身指定 DLL 路径)。例如,假设我的应用程序位于 directory 中/Application/MyApp.app/Contents/MacOS,并且foo.dylib恰好位于/Application/OtherApp.app/Contents/MacOS. DLL 加载使用dlopen().
现在,事实证明,它foo.dylib本身需要一堆其他 DLL,它们位于同一目录中,但我事先对此一无所知。每个这样的额外 DLL 都foo.dylib使用诸如@executable_path/bar.dylib. 的语义@executable_path是它应该被找到当前进程可执行文件的目录替换。这对 OtherApp 非常有用,而不是对我:当我打开时foo.dylib,它会尝试加载bar.dylib,它会在/Application/MyApp.app/Contents/MacOS/bar.dylib不正确的目录中查找它。
一种解决方法是将DYLD_FALLBACK_LIBRARY_PATH环境变量设置为/Application/OtherApp.app/Contents/MacOS,但这必须在启动我的应用程序之前完成(该环境变量仅由动态链接器读取一次;以编程方式更改其值setenv()或putenv()无效)。这与文件位置的动态发现不兼容foo.dylib。
是否有一种编程方式来覆盖 的效果@executable_path?