当前位置: 首页 > 知识库问答 >
问题:

如何处理外部库的传递依赖关系?

张智
2023-03-14
cc_import(
    name = "liba",
    shared_library = "liba.so",
    deps = [":libb"],
)

cc_import(
    name = "libb",
    shared_library = "libb.so",  
)

cc_binary(
    name = "my_app",
    srcs = ["main.cpp"],
    deps = [":liba"],
)

我一直在读这方面的文章,原因是Bazel在二进制文件的runpath中只添加了它的直接依赖项。因为libb.so是传递依赖项,所以二进制文件找不到它。

为了解决这个问题,我可以想到以下几个黑客:

>

  • 添加难看的链接器标志,告诉Bazel添加到rpath而不是runpath。但是,这被认为是一个坏主意,因为rpath不推荐使用,并且不允许通过ld_library_path重写。

    • 使用cc_library而不是cc_import
    • 使用data而不是deps.

    谢了!

  • 共有1个答案

    林炫明
    2023-03-14

    我为这个问题纠结了很长时间。我建议您尝试的第一件事是启用

    copy_dynamic_libraries_to_binary

    工具链特性。我认为它主要是为Windows设计的,但也应该适用于Linux。

     类似资料:
    • 如果我将一个外部Bazel项目作为工作区依赖项引入,并且该项目有一个tools/Bazel.rc,它添加了一些默认的构建选项并定义了一些build--config选项,那么具体是如何工作的呢? 在生成这些外部生成目标时是否使用这些默认选项?在项目中构建目标时,是否可以传递外部bazel.rc文件中定义的--config选项?是否有配置Bazel外部工作区依赖项构建的最佳实践。 只是想澄清这是如何工

    • null null 尝试强制升级的错误日志:“无法解析配置”:reading-condermination-server-quarkus-impl:TestCompileClasspath“的所有文件。 无法解析JUnit:JUnit:4.13。要求方:project:reading-concermination-server-quarkus-impl>找不到满足版本约束的“junit:junit

    • 在Karaf中,我可以安装OBR特性,并使用OBR:addURL添加一个repository.xml和OBR:deploy来部署一个bundle以及所有可传递依赖项。我已经在https://stackoverflow.com/A/10989017/242042中记录了它 然而,现在我想要使用PaxExam创建一个JUnit测试,但似乎无法仿真我在PaxExam上使用Karaf所做的事情。 说明如何

    • 我正在尝试构建一个简单的REST服务来学习OSGI。我正在使用Spark Servlet来处理请求。 我将 spark core 作为依赖项嵌入,在 maven 中构建了我的项目,并在部署时在 Karaf 中出现了布线包错误。 看起来我一个接一个地跟踪程序包,一个一个地解决每个错误,仅仅解决依赖关系就需要大约2个小时。显然我做错了什么。。 我应该如何执行此操作,以便使用 spark servlet

    • 如果我正在创建一个带有如下头文件的静态库: 在我自己的项目中,我可以告诉编译器(在我的例子中是Visual Studio)在哪里查找SomeHeaderFile.h。但是,我不希望我的用户关心这一点--他们应该能够包含我的头,而不必通知编译器SomeHeaderFile.h的位置。 这类情况通常如何处理?

    • 假设我有这个组件,带有以下钩子: 上面的钩子将运行 一旦第一次执行组件代码 每次更改 但是请注意,钩子回调还引用了,而实际上没有将其传递给依赖项数组。 虽然永远不会考虑钩子是否被重新执行,但钩子回调在其主体中引用的值会发生什么变化? 例如 在初始组件渲染期间和 钩子被执行并引用值和 在随后的渲染过程中,和 钩子被重新执行,因为已更改。对于它引用值,但是对于值它引用了什么<代码>B或 钩子引用值是基