【问题标题】:Bazel build doesn't link the dependency .so filesBazel 构建未链接依赖项 .so 文件
【发布时间】:2020-02-01 10:40:00
【问题描述】:

我正在尝试在使用 bazel 构建的 NVIDIA isaac SDK 中编写一个小码。以下是这种情况。我有一个与 B.so 链接的 A.so 文件。但是使用 A.so 我已经编写了一个 codelet 并在 cc_library() 的 srcs 列中提到了 A.so。编译成功,但是在运行时,最终的二进制文件找不到B.so文件。

下面给出的是一个示例 cc_library 规则,其中提到了 lib/ 目录中的所有 .so 文件。当我运行应用程序时,它只能链接 A.so 文件,即使其他依赖项 .so 文件在同一路径中,它也无法获取它们。

部署后,最终的 .so 文件被放置在某个目录中,如下所示 "_solib_arm64-v8a/_U@xxx_Uaarch64_Ujetpack42_S_S_Cxxx_Uaarch64_Ujetpack42___Uextern"al_Sxxx_Uaarch64_Ujetpack42_Sisaac_Upackage_Slib/"

我看到该目录中的所有依赖项 .so 文件。但除非我手动导出 LD_LIBRARY_PATH 变量中的路径,否则它不会拾取它们。

cc_library (

name = "xyz",

srcs = glob(["lib/*.so*"]),

hdrs = glob(["include/*.h*"])+
       glob(["include/opencv2/*.h*"])+
       glob(["include/opencv2/core/**/*.h*"])+
       glob(["include/opencv2/highgui/*.h*"])+
       glob(["include/opencv2/imgcodecs/*.h*"])+
       glob(["include/opencv2/videoio/*.h*"])+
       glob(["include/opencv2/imgproc/**/*.h*"]),
includes = ["include"],


visibility = ["//visibility:public"],
deps = [
    "@com_nvidia_isaac//third_party:cuda",
    "@libvtk_aarch64",
    "@openni_dev_aarch64"
],

)

问:有没有其他方法可以在不指定 LD_LIBRARY_PATH 的情况下使链接正常工作?

【问题讨论】:

    标签: c++ gcc linker-errors nvidia bazel


    【解决方案1】:

    共享对象 (.so) 库并不是要随心所欲地从任意目录中获取,这将是一个安全问题,因为有人可以提供一个被黑的库来替换合法的库。 LD_LIBRARY_PATH 用于快速测试。查找使用来自的路径 /etc/ld.so.conf

    对于 gcc,有一种方法可以告诉链接器在哪里查找,使用 -R 标志,在此处描述:Can't find .so in the same directory as the executable?。 如果是 Bazel,它可能可以通过 linker_flag: 解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 2018-03-18
      • 2021-05-13
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2015-06-28
      • 2017-11-21
      相关资源
      最近更新 更多