Связывание динамической библиотеки с помощью Bazel в MacOS

Я компилирую свою программу, используя Bazel, и у меня есть зависимость от Intel TBB.
Intel TBB предоставляет динамические библиотеки (не статичные) только по уважительным причинам (если вам интересно: Ctrl + F статический здесь).

В своей рабочей базе я определил это правило:

new_local_repository(
name = "inteltbb",
path = "./third_party/intel_tbb",
build_file = "./third_party/inteltbb.BUILD",
)

а в моем «inteltbb.BUILD» у меня есть:

cc_library(
name = "dynamic_lib",
srcs = ["build/macos_intel64_clang_cc8.1.0_os10.12.5_debug/libtbb_debug.dylib"],
hdrs = glob(["include/**/*.h"]),
visibility = ["//visibility:public"],
strip_include_prefix = "include/")

Затем в моей последней программе (по правилу cc_binary) у меня есть:

deps = [
"@inteltbb//:dynamic_lib", [...]

Он правильно компилируется, находит заголовки успешно, но во время выполнения вылетает, говоря:

____Running command line: bazel-bin/build-game
dyld: Library not loaded: @rpath/libtbb_debug.dylib
Referenced from: /private/var/tmp/_bazel_dmabin/526b91f44cfc47d856222c6b20765cc8/execroot/__main__/bazel-out/darwin_x86_64-fastbuild/bin/build-game
Reason: image not found

Я проверяю в папке «bazel-bin» (где исполняемый файл является символической ссылкой для выполнения во время выполнения: bazel-bin / build-game.runfiles /главный/) и у меня есть:

  • символическая ссылка для исполняемого файла (build-game)
  • папка с именем (готовьтесь): _solib_darwin_x86_64/_U@inteltbb_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Sbuild_Smacos_Uintel64_U
    clang_Ucc8.1.0_Uos10.12.5_Udebug
    которые содержат мой libtbb_debug.dylib для Intel TBB.

Также, когда я бегу: otool -l build-game | grep LC_RPATH -A2 результат:

      cmd LC_RPATH
cmdsize 152
path $ORIGIN/_solib_darwin_x86_64/_U@inteltbb_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Sbuild_Smacos_Uintel64_Uclang_Ucc8.1.0_Uos10.12.5_Udebug (offset 12)

Я не понимаю, почему мой исполняемый файл не находит мой dylib. Я не могу найти ничего плохого в выводе otool, но я не эксперт по Mac (вообще).
Любая идея приветствуется.

[редактировать] Если я отредактирую исполняемый файл с помощью otool, чтобы заменить путь к dylib следующим образом:

@executable_path/_solib_darwin_x86_64/_U@inteltbb_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Slib/libtbb_debug.dylib

Тогда все работает нормально. Я не чувствую, что Базель заставляет меня делать это при каждой компиляции: /

[править 2] Несколько человек спросили меня, какую строку я использовал для изменения пути к библиотеке в исполняемом файле.
Первый забег:

otool -L build-game

Чтобы определить путь библиотеки, которую вы хотите изменить. В моем случае это было: @ rpath / libtbb_debug.dylib.
После этого запустите:

install_name_tool -change @rpath/libtbb_debug.dylib @executable_path/_solib_darwin_x86_64/_U@inteltbb_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Slib/libtbb_debug.dylib build-game

изменить путь. Обратите внимание, что вы можете использовать @executable_path, чтобы сделать его относительно двоичного пути, или вы можете указать абсолютный путь до вас.

1

Решение

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

[редактировать: обновлено после отправки исправления]
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector