c++ - Bazel 构建不链接依赖项 .so 文件

标签 c++ gcc linker-errors nvidia bazel

我正在尝试在使用 bazel build 的 NVIDIA isaac SDK 中编写小码。情况如下。我有一个与 B.so 链接的 A.so 文件。但是使用 A.so 我写了一个小代码并在 cc_library() 的 srcs 列中提到了 A.so。编译成功,但是在运行时,最终的binary找不到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 中指定的情况下使链接正常工作?

最佳答案

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

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

关于c++ - Bazel 构建不链接依赖项 .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213567/

相关文章:

c - 为什么 `__builtin_{{s,u}{add,sub,mul}ll_overflow` 给出 `long int` 结果而不是 `long long int` 结果?

c - 如何得到C程序的空间复杂度?

compiler-errors - CodeBlocks - Irrlight 编译/运行错误

Xcode : warning: directory not found for option

c++ - 带数组的列表( vector )定义

C++如何从在构造函数上采用参数的类创建std::unique_ptr

c++ - OpenMP 仅使用一个线程

c++ - 由于已经定义而导致的链接器错误

c++ - 如果同时指定 EHsc 和 EHa 会发生什么

c++ - 什么时候在空实例上调用成员函数会导致未定义的行为?