2014-11-12 4 views
1

Итак, я переношу игру из Linux на OS X и успешно скомпилировал ее и связал, теперь я столкнулся с проблемами, связанными с ее запуском - динамический компоновщик не может найти библиотеки.Почему общие библиотеки связаны с абсолютными путями в OS X?

Вот otool -L выход:

./foo: 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
     @rpath/SDL2.framework/Versions/A/SDL2 (compatibility version 1.0.0, current version 3.1.0) 
     /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0) 
     /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 59.0.0) 
     /usr/lib/libGLEW.1.10.0.dylib (compatibility version 1.10.0, current version 1.10.0) 
     /usr/lib/libtheoradec.1.dylib (compatibility version 3.0.0, current version 3.4.0) 
     /usr/lib/libtheora.0.dylib (compatibility version 4.0.0, current version 4.10.0) 
     /usr/local/lib/libvorbis.0.dylib (compatibility version 5.0.0, current version 5.7.0) 
     /usr/local/lib/libogg.0.dylib (compatibility version 9.0.0, current version 9.2.0) 
     @loader_path/libsteam_api.dylib (compatibility version 1.0.0, current version 1.0.0) 
     /Users/macosx/some/path/to/code/openal-soft-1.16.0/build/libopenal.1.dylib (compatibility version 1.0.0, current version 1.16.0) 
     /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) 

Дело в том, некоторые из этих путей являются просто неправильно. Например, ни GLEW, ни Ogg/Vorbis/Theora не существуют в /usr/…, и по какой-либо причине путь к OpenAL Soft сжигается как абсолютный, где он был построен.

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

Что здесь происходит? Есть ли способ заставить относительные пути (это, наверное, @loader_path?) По библиотекам по моему выбору? Имеется ли документация по этому вопросу?

+1

Да, это сложно, но при связывающая абсолютные пути внедренные в исполняемый файл. Dylib, которые не являются частью системы, должны быть перемещены в папку «Frameworks» пакета приложений и «install_name», используемые для изменения их пути в исполняемом файле. Существуют различные статьи о том, как это сделать в сети. – trojanfoe

+0

ОК, поэтому, если я ищу «установить имена», я должен найти соответствующую документацию, верно? – IneQuation

+1

Я так не думаю, нет. Инструмент называется 'install_name'. – trojanfoe

ответ

2

Подобно тому, как @trojanfoe предложил - это работает:

install_name_tool -change <from> <to> <executable>

+1

Трюк автоматизирует все это дерьмо, хотя :) – trojanfoe

+0

Это наименьшее из моих забот прямо сейчас! – IneQuation

 Смежные вопросы

  • Нет связанных вопросов^_^