Как скомпилировать источник, который использует путь dylib на macOS Sierra из оболочки

Я компилирую некоторый исходный код, который требует некоторых dylib из другого проекта, который я уже создал. Я получаю

ld: символ (-ы) не найден для архитектуры x86_64`

Всякий раз, когда я выполняю

g++ some_code.cpp -I/usr/local/include -o executable_binary

Я знаю, что g++ не может найти скомпилированные dylib (установленные в /usr/local/include), так как в этой ошибке также упоминается множество конкретных символов, которые являются частью dylib.

Я уже пробовал это:

  • Выполнение install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
  • Добавление -L/usr/local/lib в параметры компиляции.
  • Добавление всех путей dylib явно к параметрам компиляции.
  • Попробуйте добавить DYLD_LIBRARY_PATH неудачно, так как Sierra не позволяет установить эту переменную по соображениям безопасности.

Я знаю, что возможно добавить DYLD_LIBRARY_PATH, но для этого необходимо отключить SIP. Я могу это сделать, я не хочу, чтобы сделать это более чистым способом.

P.S.: Я пытаюсь скомпилировать примеры учебников для библиотеки графа тюльпанов.

Пропущенные символы связаны с библиотекой графиков, которую я установил. Сообщение об ошибке:

Undefined symbols for architecture x86_64:
  "tlp::saveGraph(tlp::Graph*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, tlp::PluginProgress*)", referenced from:
      _main in tutorial001-02ee7e.o
  "operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, tlp::Graph const*)", referenced from:
      _main in tutorial001-02ee7e.o
ld: symbol(s) not found for architecture x86_64

Всякий раз, когда я делаю ls /usr/local/lib/requiredlib.dylib, все скомпилированные библиотеки из Tulip существуют.

g++ -v производит:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

После выполнения ls /usr/local/include/tulip/ я получаю список файлов *.h библиотек, которые я намерен использовать.

Ответ 1

Кроме того, вы также можете посмотреть опцию undefined ld

Указывает, как следует обрабатывать символы undefined. Возможные варианты: ошибка, предупреждение, подавление или dynamic_lookup. По умолчанию используется ошибка.

Это вы бы назвали как -Wl,-undefined,dynamic_lookup при компиляции своего двоичного файла.

Вы также можете использовать -lazy-lx или -lazy-library path, чтобы библиотека не загружалась до тех пор, пока не вызывается первая функция в ней, что может помочь в некоторых случаях.

Затем добавьте флаг rpath, изменив имя с помощью install_name_tool, как показано на рисунке @macmoonshine, но не забудьте указать правильный путь. По умолчанию Tulip установлен в папке библиотеки по умолчанию /usr/local, но он рекомендовал в руководстве по установке сделать это в управляемом пользователем каталоге.

Что-то вроде следующей команды, для всех библиотек, требуемых тюльпаном.

install_name_tool -change ./build-release/lib/libtulip-core-4.11.dylib '@rpath/libtulip-core-4.11.dylib' tutorial001

И также используйте -Wl,-rpath,./build-release/lib при компиляции учебника.

Ответ 2

Вы можете установить -rpath для поиска библиотек. После связывания вашего двоичного файла вам нужно изменить путь поиска в lib, e. г:.

g++ some_code.cpp -I/usr/local/include -o binary \
    -L/usr/local/lib -lrequiredlib -Wl,-rpath,/usr/local/lib
install_name_tool -change /usr/local/lib/librequiredlib.dylib \
    '@rpath/librequiredlib.dylib' binary

Команда install_name_tool изменяет имя библиотеки в двоичном файле, так что поиск библиотеки будет выполняться в rpath. Если вы не уверены в правильном имени, используйте otool -L binary, чтобы просмотреть все библиотеки, связанные с вашим исполняемым файлом.

См. справочную страницу ld и install_name_tool, чтобы получить дополнительную информацию о rpath. install_name_tool может также добавить больше rpath с помощью -add_rpath.

Ответ 3

Похоже, вы делаете ошибки x86_64, проверяли ли вы, что ваши установленные .dylib тоже x86_64?

Используйте команду otool или file, чтобы определить, что ваши dylibs x86_64. Например, попробуйте что-то вроде этого file /usr/local/lib/requiredlib.dylib. Если вы не видите это на выходе:

requiredlib.dylib(для архитектуры x86_64): Mach-O 64-разрядная динамически связанная общая библиотека x86_64

тогда ваша проблема является несогласованной аркой при создании библиотек и при создании кода, который должен использовать эти библиотеки.