OSX Framework, связывающий проблемы - PullRequest
1 голос
/ 03 февраля 2011

Я работаю над частной платформой для OSX 10.6, которая включает в себя некоторые инструменты командной строки, а также некоторые библиотеки. Теперь для dylib необходимо связать друг с другом, а инструменты командной строки - для dilibs.

Инструменты командной строки и файлы .dylibs находятся в папке Resources внутри пакета фреймворка. Я использовал install_name_tool, чтобы обновить все пути до:

@executable_path/../Frameworks/MyCompany.framework/Versions/A/Resources/lib.dylib

Теперь все dylib загружаются корректно при использовании приложением, но инструменты командной строки при запуске завершаются неудачно с dyld: Library not loaded при запуске следующим образом:

// dylibpath is an NSString set the the path of the Resources folder within the framework

NSTask *task = [[[NSTask alloc]init]autorelease];
[task setEnvironment:[NSDictionary dictionaryWithObjectsAndKeys:@"DYLD_LIBRARY_PATH", dylibPath, nil]];
[task setLaunchPath:binConvert];
[task launch];
[task waitUntilExit];

Теперь я из Windows, где загрузчик найдет библиотеки DLL, если они находятся в той же папке, что и приложение, но, очевидно, OSX ищет полный путь. Как я могу получить инструмент командной строки, чтобы найти dylibs в той же папке?

Спасибо, J

1 Ответ

2 голосов
/ 03 февраля 2011

Есть две вещи, о которых я могу подумать.

Вариант один

Использование @rpath может лучше подходить для того, что вы пытаетесь сделать. Вот что происходит здесь:

Все ваши библиотеки ожидают, что они будут расположены одинаково относительно любого исполняемого файла. Они все будут по адресу:

@executable_path/../Frameworks/MyCompany.framework/Versions/A/Resources/lib.dylib

Что вы могли бы сделать, если поместите все свои библиотеки в нужное место относительно исполняемых файлов. Вместо этого вы можете установить имя установки для dylibs (через install_name_tool) в @rpath/lib.dylib. Затем это должно работать с переменной среды DYLD_LIBRARY_PATH, но она действительно подходит для использования с флагом компилятора -rpath, так что это может сработать, но я никогда не пробовал.

Вариант два

Вы также можете создавать символические ссылки, чтобы библиотека была фактически найдена путем перехода от исполняемых файлов к пути, который вы указали в качестве имени для установки.

...