2016-07-31 18 views
1

У меня есть проект в Xcode, где я поставил DYLD_FALLBACK_LIBRARY_PATH в области переменных окружения, где мое приложение должно искать библиотеки для ссылки (который работает хорошо для моих целей)Как установить dylib путь поиска OSX

enter image description here

Я пишу файл CMakeLists.txt для создания этого проекта сейчас, и я хотел бы установить это свойство из сценария.

Я знаю, что я могу сделать это:

SET(ENV{DYLD_FALLBACK_LIBRARY_PATH} ${DYLD_FALLBACK_LIBRARY_PATH} /path/to/lib) 

, но когда я бегу я получаю эту ошибку:

'dyld: Library not loaded ... Reason: image not found' 

при запуске приложения. Я полагаю, что это не одно и то же.

Кто-нибудь знает, как я могу достичь эквивалента того, что у меня есть в Xcode, из CMakeLists.txt?

Я смутно знаю материал CMake RPATH, но я предпочел бы избежать этого, если это возможно.

Благодарим вас за внимание!

Приветствия!

Том

+2

'Я смутно осознает RPATH вещи CMake, но я предпочел бы избежать этого, если это возможно. '- Но это правильный способ сделать то, что вы хотите. См. Https://cmake.org/Wiki/CMake_RPATH_handling для получения дополнительной информации. 'SET (ENV {..})' устанавливает переменную среды только на стадии запуска cmake, она не влияет на среду для этапа сборки или запуска. – Tsyvarev

+1

Привет! Я, наверное, должен был бы подчеркнуть vaugely ...: P В моей ситуации есть dylib (в данном случае SDL), который я хочу связать во время выполнения, но я не хочу добавлять его к системному пути (/ usr/local/bin ..) Я просмотрел материал RPATH, но все это просто выглядело супер запутанным. Я прочитал эту статью и попробовал некоторые из материалов CMake, которые он сказал, но не имел большой удачи. Должен ли я делать dylib install_name_tool? Я хотел избежать этого, поскольку это показалось немного странным. Мой фон - это в основном Windows, поэтому, возможно, мне не хватает чего-то очевидного! Благодаря! – Tom

+0

Если у вас возникли проблемы, когда вы читаете статью CMake о RPATH, расскажите о конкретных проблемах. – Tsyvarev

ответ

3

я, наконец, получить эту работу, используя несколько иной подход. Это может быть не идеальное решение и работа во всех случаях, но, надеюсь, это поможет кому-то, у кого похожие проблемы.

dylib я пытался связать с был libSDL2-2.0.0

Если я перемещаться туда, где этот файл находится и запуск:

otool -L libSDL2-2.0.0.dylib 

в верхней строке я получаю на выходе это:

/usr/local/lib/libSDL2-2.0.0.dylib 

если я затем перейдите к моей встроенным исполняемым и запустить ту же команду, я вижу то же самое:

/usr/local/lib/libSDL2-2.0.0.dylib 

(мои ссылки на исполняемые SDL)

Моя проблема была libSDL2-2.0.0.dylib не на самом деле находится там, в моей структуре проекта в папке Libs.Для того, чтобы получить компоновщик найти LIB во время выполнения, я должен был выполнить эту команду на dylib

install_name_tool -id "@executable_path/../path/to/lib/<lib_name>" <lib_name> 

где @executable_path является расположение запускаемого приложения - в моем случае это было в - build/debug

структура проекта:

root/ 
    CMakeLists.txt 
    project/ 
     lib/ 
      libSDL2-2.0.0.dylib 
    build/ 
     debug/ 
      my_app 

Это точная отображение для ясности:

install_name_tool -id "@executable_path/../../project/lib/libSDL2-2.0.0.dylib" libSDL2-2.0.0.dylib 

Если я бегу otool -L libSDL2-2.0.0.dylib я теперь вижу:

@executable_path/../../sdl-test/lib/libSDL2-2.0.0.dylib 

в первой строке вывода.

Если теперь я снова создаю свой проект (я только строю в Xcode), это обновит мое приложение с новым относительным путем к dylib. Вам нужно только запустить install_name_tool в библиотеке, вам также не нужно запускать ее в своем исполняемом файле, она будет обновлена ​​при ее создании.

Если я бегу otool -L myapp я теперь вижу тот же относительный путь к libSDL2-2.0.0.dylib

С, что при запуске приложения он смог успешно найти dylib!

Я понимаю, что это путь для достижения этой цели на OSX и есть не блестящая альтернатива (кроме баловаться с DYLD_FALLBACK_LIBRARY_PATH, которые я упомянул в моем вопросе)

Я надеюсь, что это был какой-то помощи кому-то, у кого были подобные трудности для меня!

Ресурсы я нашел полезным:

http://osiris.laya.com/coding/dylib_linking.html

https://www.fmod.org/questions/question/forum-23398/

https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac

UPDATE:

я действительно нашел еще лучший способ сделать это с помощью rpaths и мысли Я напишу, как сделайте это для справок в будущем:

В моих CMakeLists.TXT-файл я добавил эти строки в самом конце (после ADD_EXECUTABLE и TARGET_LINK_LIBRARIES:

# set @rpaths for libraries to link against 
SET(CMAKE_SKIP_BUILD_RPATH FALSE) 
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 
SET(CMAKE_INSTALL_RPATH "${PROJ_LIB_DIR}") 
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 

(см https://cmake.org/Wiki/CMake_RPATH_handling для получения дополнительной информации)

где ${PROJ_LIB_DIR} где мой dylibs расположен:

SET(PROJ_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/lib) 

Затем я бежал:

пример:

install_name_tool -id "@rpath/<my-dylib>.dylib" <my-dylib>.dylib 

фактический:

install_name_tool -id "@rpath/libSDL2-2.0.0.dylib" libSDL2-2.0.0.dylib 

в каталоге, где находится мой dylib (в моем случае libSDL2-2.0.0.dylib)

Теперь, когда я бегу CMake, а затем построить свой проект, мой новый исполняемый файл будет искать библиотеку в местоположении, которое я установил в файле CMakeLists.txt во время выполнения. @rpath будет заменен на путь, указанный в файле CMakeLists.txt и все работает без явного вызова, чтобы установить @executable_path или @loader_path