Не могу запустить программу, нажав на нее, пока я могу из Терминала
Я пытаюсь научиться создавать и использовать динамическую библиотеку в программе на C++. Все хорошо, и моя программа работает хорошо, когда я запускаю ее из терминала (я нахожусь на Mac OS X El Capitan). Удивительно, но это не тот случай, когда я пытаюсь запустить его, нажимая на исполняемый файл. Я получаю dyld: Library not loaded: liblibrary.so
, Reason: image not found
ошибка.
Все мои файлы находятся в одном репертуаре. Я строю их с помощью команд:
g++ -c -fPIC A.cpp
g++ -c -fPIC B.cpp
g++ -shared -fPIC A.o B.o -o library.so
g++ main.cpp library.so -o Program
Заранее спасибо за помощь.
Я пробовал следующие решения:
- Добавить путь, оба в
LD_LIBRARY_PATH
а такжеDYLD_LIBRARY_PATH
- Измените расширение библиотеки:
library.so
или жеlibrary.dylib
- Добавить путь
g++ main.cpp library.so -Wl,-rpath,. -o Program
а такжеg++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
2 ответа
Наконец-то я нашел решение. На самом деле, динамическое создание библиотеки отличается для macOS. То, что я пробовал с самого начала, работает только для Linux.
Итак, решение для Mac:
g++ -dynamiclib -install_name "absolute_path/library.dylib" A.o B.o -o library.dylib
где:
-dynamiclib
Mac эквивалент для-shared
,-install_name "absolute_path/library.dylib"
создать псевдонимlibrary.dylib
для компоновщика, который необходимо использоватьlibrary.dylib
,
После этого традиционная команда:
g++ main.cpp library.dylib -o Program
создает исполняемый файл, если main.cpp
а также library.dylib
находятся в том же каталоге.
Программа может использоваться везде в системе, если library.dylib
остается на том же месте.
После комментария @Ssswift можно установить относительную привязку пути с помощью команды:
g++ -dynamiclib -install_name "@executable_path/library.dylib" A.o B.o -o library.dylib
Затем библиотека может следовать за исполняемым файлом.
Спасибо за вашу помощь.
Вам может потребоваться указать явный rpath (как абсолютный, а не относительный путь) во время компиляции (например, с g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program
), или настроить некоторые DYLD_LIBRARY_PATH
Посмотри на это. Вам может понадобиться .dylib
суффикс, а не .so
один.
(У меня больше нет MacOSX, поэтому я забыл детали)