Операционная система - MacOS X, а именно 10.5 (Leopard) на PowerPC G4, но у меня такая же проблема на x86, работающем под управлением 10.6.
Я пишу приложение, которое динамически загружает DLL. DLL (назовем ее foo.dylib
) является частью другого приложения, расположенного в другом месте на жестком диске; мое приложение находит foo. dylib
программно (точное размещение может измениться, возможно, пользователь указывает путь к DLL через графический интерфейс из самого запущенного приложения). Например, предположим, что мое приложение находится в каталоге /Application/MyApp.app/Contents/MacOS
, а foo.dylib
находится в / Application / OtherApp. приложение / Содержание / MacOS
. Загрузка DLL использует dlopen ()
.
Теперь выясняется, что самому foo.dylib
нужна куча других DLL, которые находятся в том же каталоге, но о которых я заранее ничего не знаю. Каждая такая дополнительная DLL регистрируется в foo.dylib
с таким путем, как @ исполняемый_путь / 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
?