Не могу запустить программу, нажав на нее, пока я могу из Терминала

Я пытаюсь научиться создавать и использовать динамическую библиотеку в программе на 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, поэтому я забыл детали)

Другие вопросы по тегам