操作系统是MacOS X,特别是PowerPC G4上的10.5(Leopard),但我在运行10.6的x86上遇到了同样的问题.
我正在编写一个动态加载DLL的应用程序.DLL(让我们称之为foo.dylib)是另一个应用程序的一部分,位于硬盘的其他位置; 我的应用程序以foo.dylib编程方式找到(确切的安置可能会改变,可能用户通过运行的应用程序本身的GUI指定DLL路径).例如,假设我的应用程序位于目录中/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?