操作系统是 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
?