【问题标题】:Linking a dynamic lib using Bazel on MacOS在 MacOS 上使用 Bazel 链接动态库
【发布时间】: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/ma​​in/),我确实有:

  • 可执行文件的符号链接(构建游戏)
  • 一个名为(支撑自己)的文件夹:_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 for 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 使其相对于二进制路径,也可以设置绝对路径,由您自己决定。

【问题讨论】:

    标签: c++ macos dylib bazel


    【解决方案1】:

    我认为这已经是known issue,并且刚刚修复。给您添麻烦了。

    [编辑:提交修复后更新]

    【讨论】:

    • 感谢您的信息。与此同时,在 mac 上,我有一个丑陋的 make 可以解决问题,直到问题在 Bazel 中得到解决......
    • 现在试一试,然后马上标记你的答案:)
    • 我没有更新评论,因为我正在等待 0.5.5 来检查修复:)
    • 0.6.0 的发布让我非常兴奋,但它并没有解决我的问题:/ Rpath 还是一样的:otool -l build-game | grep LC_RPATH -A2 cmd LC_RPATH cmdsize 104 路径 $ORIGIN/_solib_darwin_x86_64/_U@inteltbb_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Slib(偏移量 12)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2022-12-14
    相关资源
    最近更新 更多