Я компилирую свою программу, используя 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 /главный/) и у меня есть:
_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 (вообще).
Любая идея приветствуется.
@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, чтобы сделать его относительно двоичного пути, или вы можете указать абсолютный путь до вас.
Я думаю, что это уже известная проблема, и это было просто исправлено. Извините за беспокойство.
[редактировать: обновлено после отправки исправления]Других решений пока нет …