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

时间:2019-10-03 06:39:41

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

我正在尝试在使用bazel构建的NVIDIA isaac SDK中编写一个小代码。情况如下。我有一个与B.so链接的A.so文件。但是我使用A.so编写了一个小代码,并在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"
],

Q:是否有其他方法可以使链接正常运行而无需在LD_LIBRARY_PATH中进行指定?

1 个答案:

答案 0 :(得分:0)

共享对象(.so)库并非一时兴起要从任意目录中提取,这将是一个安全问题,因为有人可以提供被黑客入侵的库来代替合法库。 LD_LIBRARY_PATH用于快速测试。查找使用来自的路径 /etc/ld.so.conf

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