【发布时间】:2017-12-27 02:47:24
【问题描述】:
我正在使用 Bazel 编译我的程序,并且我依赖于英特尔 TBB。 英特尔 TBB 仅提供动态库(非静态库)是有充分理由的(如果您好奇:ctrl+f static here)。
在我的 bazel WORKSPACE 中,我定义了该规则:
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/main/),我确实有:
- 可执行文件的符号链接(构建游戏)
- 一个名为(支撑自己)的文件夹:
_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.dylibfor 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
然后它工作正常。我觉得 bazel 强迫我在每次编译时都这样做是不对的:/
[编辑 2] 有几个人问我用来修改可执行文件中lib路径的那一行。 第一次运行:
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 使其相对于二进制路径,也可以设置绝对路径,由您自己决定。
【问题讨论】: