я, наконец, получить эту работу, используя несколько иной подход. Это может быть не идеальное решение и работа во всех случаях, но, надеюсь, это поможет кому-то, у кого похожие проблемы.
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
'Я смутно осознает RPATH вещи CMake, но я предпочел бы избежать этого, если это возможно. '- Но это правильный способ сделать то, что вы хотите. См. Https://cmake.org/Wiki/CMake_RPATH_handling для получения дополнительной информации. 'SET (ENV {..})' устанавливает переменную среды только на стадии запуска cmake, она не влияет на среду для этапа сборки или запуска. – Tsyvarev
Привет! Я, наверное, должен был бы подчеркнуть vaugely ...: P В моей ситуации есть dylib (в данном случае SDL), который я хочу связать во время выполнения, но я не хочу добавлять его к системному пути (/ usr/local/bin ..) Я просмотрел материал RPATH, но все это просто выглядело супер запутанным. Я прочитал эту статью и попробовал некоторые из материалов CMake, которые он сказал, но не имел большой удачи. Должен ли я делать dylib install_name_tool? Я хотел избежать этого, поскольку это показалось немного странным. Мой фон - это в основном Windows, поэтому, возможно, мне не хватает чего-то очевидного! Благодаря! – Tom
Если у вас возникли проблемы, когда вы читаете статью CMake о RPATH, расскажите о конкретных проблемах. – Tsyvarev