首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在非源/库文件上添加cc_binary依赖项

在非源/库文件上添加cc_binary依赖项通常是指在使用Bazel构建系统时,尝试将一个cc_binary目标(编译后的二进制文件)作为依赖项添加到一个非源代码或库文件的目标上。这在Bazel中是不直接支持的,因为cc_binary是用来生成可执行文件的,而不是作为库文件被其他目标依赖。

基础概念

  • cc_binary: Bazel中的一个构建目标,用于编译C++源代码生成可执行文件。
  • 依赖项: 在构建系统中,一个目标可能需要其他目标的输出作为输入,这种关系称为依赖项。

相关优势

通常,将cc_binary作为依赖项并不常见,因为它意味着一个可执行文件需要另一个可执行文件作为构建输入,这在逻辑上是不合理的。然而,如果你确实需要在构建过程中使用一个已编译的二进制文件,可以考虑以下替代方案:

  1. cc_library: 将需要的代码编译成库文件,然后其他目标可以依赖这个库。
  2. filegroup: 创建一个包含所需二进制文件的文件组,然后在需要的地方引用这个文件组。

类型与应用场景

  • cc_library: 适用于需要共享代码的场景,可以被多个cc_binary或其他cc_library依赖。
  • filegroup: 适用于需要引用一些非源代码文件(如配置文件、预编译的二进制文件等)的场景。

遇到的问题及原因

如果你尝试在非源/库文件上添加cc_binary依赖项,可能会遇到以下问题:

  • 构建失败: Bazel不允许直接将cc_binary作为依赖项添加到非源代码目标上。
  • 逻辑错误: 通常没有必要将一个可执行文件作为另一个目标的输入。

解决方法

如果你需要在构建过程中使用一个已编译的二进制文件,可以考虑以下解决方案:

使用cc_library

将需要的代码编译成库文件:

代码语言:txt
复制
cc_library(
    name = "my_lib",
    srcs = ["my_code.cc"],
)

然后在其他目标中依赖这个库:

代码语言:txt
复制
cc_binary(
    name = "my_binary",
    srcs = ["main.cc"],
    deps = [":my_lib"],
)

使用filegroup

创建一个包含所需二进制文件的文件组:

代码语言:txt
复制
filegroup(
    name = "my_binary_file",
    srcs = ["path/to/my_binary"],
)

然后在需要的地方引用这个文件组:

代码语言:txt
复制
genrule(
    name = "use_my_binary",
    srcs = [":my_binary_file"],
    outs = ["output.txt"],
    cmd = "$(location :my_binary_file) > $@",
    tools = [":my_binary_file"],
)

在这个例子中,genrule使用了my_binary_file中的二进制文件来生成output.txt

通过上述方法,你可以绕过直接在非源/库文件上添加cc_binary依赖项的限制,同时保持构建逻辑的清晰和正确性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Google最新源码编译系统

Android.bp 文件格式 Android.bp 的设计非常简单,没有条件判断或控制流语句。在 Go 语言中编写的构建逻辑没有任何复杂度。...模块 模块在 Android.bp 文件中以一个模块类型开始,后面跟着一组属性,以名值对(name: value)表示。...变量 Android.bp 文件可以包含顶级变量并赋值: gzip_srcs = ["src/test/minigzip.c"], cc_binary { name: "gzip",...Android.mk和Android.bp之间的差异 Android.mk 文件通常包含了拥有相同名称的多个模块(例如,对于同时拥有静态和动态版本的库,或同时供主机和设备使用的库)。...Android.bp 文件要求每个模块拥有唯一的名称,但每个模块可以内置多种变化,例如添加 host_supported: true。

2K20
  • Android 项目构建编译概述

    Git 参考git官方使用说明文档 Git可以处理分布在多个代码库上的大型项目。Android使用Git执行本地操作,例如建立本地分支、提交、对比差异、修改 2.2.2....条件语句 Soong不支持Android.bp文件中的条件语句。 但是,编译规则中需要条件语句的复杂问题将在Go在这种语言中,您可以使用高级语言功能,并且可以跟踪条件语句引入的隐式依赖项)中处理。...可以通过运行不包含参数的m来构建整个源代码树,也可以通过指定相应名称来构建特定目标 mma: 构建当前目录中的所有模块及其依赖项 mmma: 构建提供的目录中的所有模块及其依赖项 croot: cd 到树顶部...运行编译结果 可以在模拟器上运行构建系统,也可以将其刷写到设备上。由如果已经使用lunch选择了构建目标,就不能在构建目标以外的目标上运行。...在构建相应产品时,应将源路径下的文件复制到目标路径。config/makefile 中定义了针对复制步骤的规则 PRODUCT_DEVICE 工业设计的名称。

    3.3K20

    自定义规则实现将多个静态库合并为一个动态库或静态库

    规则是没有这个功能的,Bazel C/C++ 相关的内置规则有: cc_binary :生成可执行文件 cc_import :允许用户导入预编译的 C/C++ 库,包括动态库、静态库 cc_library...例如 cc_binary 规则可能: 输入(Inputs):获取一组 .cpp 文件 动作(Action):基于输入运行 g++ 输出(Output):返回一个可执行文件 从 Bazel 的角度来看,g...方式二(需安装libtool): # MacOS系统 $ libtool -static -o libcombined.a libA.a libB.a libC.a 在 Unix-like 系统上:...它将其注册在依赖关系图中,因为一个 Action 可以依赖于另一个 Action 的输出(例如,在 C 语言中,必须在编译后调用链接器)。在执行阶段,Bazel 会决定必须以何种顺序运行哪些操作。...最后在实现自定义规则中将多个静态库合并为一个动态库示例中,这里有几个点我们需要注意下: 在实现我们中间文件的拷贝过程中,如果最后没有实现输出 output Action,那么中间文件也不会产生,这在我调试过程中带给了我一阵疑惑

    5.4K20

    百度Apollo源码学习之Bazel编译介绍

    每个工作空间目录都有一个名为的文本文件WORKSPACE,该文件可以为空,或者可以包含 对构建输出所需的外部依赖项的引用。 包含名为的文件 WORKSPACE的目录被视为工作空间的根。...继续搜索源码,在文件apollo.sh中: image.png 这里sed的作用: sed 可依照脚本的指令来处理、编辑文本文件。...Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 文件中大部分描述的就是编译过程中所需要的外部依赖. 具体语法可以参考官网....BUILD文件 BUILD文件中包含了多个不同类型的bazel指令。 其中最重要的是编译规则(build rule),它告诉bazel怎么编译目标输出,是一个执行文件还是一个库。...BUILD文件中每一个编译规则被称为target,指向了一堆源文件和相关的依赖,一个target也可以指向其他target。

    3.4K40

    Istio实战系列-Envoy Proxy构建分析

    但这个库中并不包含Envoy自身的源代码,因此这个库在构建时会从Github上下载Envoy源码进行联合编译。 编译工具 Envoy采用了Bazel进行构建。...其特点是可读性较好,支持跨语言,跨平台编译;并且可以定义代码库之间的依赖关系,支持跨代码库的联合构建。...每个工作空间中有一个WORKSPACE文件,该文件用于描述该工作空间的外部依赖,例如依赖的Github上的第三方代码。...另外target还可以依赖外部Repository中的另一个target,这个外部Repository可以是文件系统上另一个文件夹下的项目,github的项目或者http下载的代码。...前5个target都是本地依赖,对应到源码目录中的其他子目录下的BUILD文件,其中最后一个比较特殊,是一个外部依赖,该外部库为envoy。 外部库定义在根目录下的WORKSPACE文件中。

    1.8K10

    Android指纹解锁源码分析

    在systemServer进程的run方法中会启动重要服务其中就包括指纹解锁相对应的服务。...启动指纹解锁对应的Service,也就是FingerprintService这个类 startOtherService方法: startService: 2.可以看到会反射创建这个类的构造方法并把它添加到...文件详解 这里首先看下一些配置信息 这是一些注释信息: cc_library_shared :编译成动态库,类似于Android.mk中的BUILD_SHARED_LIBRARY cc_binary...中的LOCAL_SRC_FILES local_include_dirs:指定路径查找头文件,类似于Android.mk中的LOCAL_C_INCLUDES shared_libs:编译所依赖的动态库...,类似于Android.mk中的LOCAL_SHARED_LIBRARIES static_libs:编译所依赖的静态库,类似于Android.mk中的LOCAL_STATIC_LIBRARIES

    63320

    SpringBoot 太强了,这些优势你需要了解

    自动配置数据源 在Spring Boot中,我们可以通过添加以下依赖来自动配置数据源: <dependency> <groupId>org.springframework.boot...如果你想使用其他的数据源,比如连接池数据源,只需要在项目中添加相应的依赖即可。...Thymeleaf,并且会包含所有必需的依赖项,比如Thymeleaf核心库、Thymeleaf标准方言等。...Spring Boot Starter是一个可重用的“启动器”,它包含了特定的依赖项,可以轻松地在项目中添加功能模块,例如Spring Data JPA、Spring Security等。...例如,如果我们想要使用Spring Data JPA来访问数据库,只需要添加spring-boot-starter-data-jpa依赖,Spring Boot就会自动配置相关的依赖项,并且提供一些默认的配置选项

    14710

    Android HAL 与 HIDL 开发笔记

    后台服务 有了动态库,我们就可以编写实际的服务程序了。由于服务端使用的是 impl.so,那么就把服务端的代码也在 Demo.cpp 相同的目录中实现。...sepolicy 在非测试版本中,SELinux 的权限可能导致服务端无法注册或者客户端无法和服务端进行交互,因此需要添加对应的标签和权限。...添加 rc 文件 添加 rc 文件的目的是让硬件服务可以开机启动,并且设置好对应的启动权限,这里的rc 文件路径为: /vendor/etc/init/android.hardware.demo@1.0...make bootimage 添加 Label 在device/huawei/angler/sepolicy/file_contexts文件中新增一行: # Demo hal /vendor/bin/hw...在测试阶段,最好先修改platform/device///BoardConfig.mk文件,将系统设置为 Permissive 模式,等到 SELinux 相关规则添加完成后再恢复成

    1.7K20

    Gradle Java 插件

    一个源集有一个相关联的编译类路径和运行时类路径。 Java 插件就是通过源集的概念来管理源代码目录的。 源集的一个用途是,把源文件进行逻辑上的分组,以描述它们的目的。...源集提供了很多属性,我这里就列出几个重要的属性: 属性 类型 默认值 描述 name - 只读 String 非空 源集的名字 output - 只读 SourceSetOutput 非空 源集的输出文件...:所有参与编译类路径的任务,包括 jar 任务和通过项目依赖性在类路径上的项目中的任务。...下面的图展示了这些任务的关系 依赖管理 Java 插件增加了很多依赖配置到项目中,JavaCompile 和 test 任务就可以使用这些配置将依赖文件添加到类路径并使用他们。...灰蓝背景: 该配置用于被任务使用,而不是用于声明依赖项。

    1.3K20

    掌握pip的基本命令和高级用法:轻松管理Python包

    例如,在Ubuntu上可以使用apt-get命令进行安装,在CentOS上可以使用yum命令进行安装,在macOS上可以使用Homebrew进行安装。...(3)在pip.conf文件中,可以使用以下配置选项来自定义pip的配置:index-url:指定默认的软件源URL,用于安装包。...在项目目录中创建一个名为requirements.txt的文件,该文件列出了要下载的非Python包资源的名称和版本号。...可以尝试重新安装pip,或者确保pip已经添加到系统的环境变量中。...移除冲突的依赖项:如果依赖冲突无法解决,可以尝试移除其中一个依赖项。使用命令pip uninstall package-name来移除特定的依赖项,确保在移除之前了解其对项目的影响。

    23600

    Dlink + FlinkSQL构建流批一体数据平台——部署篇

    三.初始化数据库 在dlink根目录sql文件夹下有2个sql文件,分别是dlink.sql和dlink_history.sql。...如果第一次部署,可以直接将dlink.sql文件在dlink数据库下执行。...四.部署nginx 在linux,首先要配置好相应的yum库,因为在安装过程中没有配置,这里可以大概讲述下步骤,可以选择连接网络或者本地yum源都可以,这里选择连接网络方式配置 #下载yum源 wget...下面就说下,如何在非root用户下得操作; 八.非root用户提交任务 创建flink提交用户的队列用flink $useradd flink 在hdfs下创建/user/flink用户文件夹,要使用root...在Hadoop配置中必填项包含配置文件路径及ha.zookeeper.quorum(可不填) Flink配置必填项包含lib 路径和配置文件路径 基本配置必填项包含标识 在基本配置中最后点击

    6.3K10

    译 | .NET Core 基础架构进化之路(二)

    突发更改几乎不可能在仓库之间有效地流动,并且重现失败仍然是有问题的,因为存储库中的源通常与实际构建的内容不匹配(因为输入版本被覆盖在源代码管理)。...自动依赖项流 在此模型中,外部基础结构用于在存储库之间以确定性、验证方式自动更新依赖项。存储库在源中显式声明其输入依赖项和相关版本,并"订阅"来自其他仓库的更新。...编译、通道和订阅 依赖项信息 在每个仓库中,都有仓库的输入依赖项的声明,以及eng/Version.Details中有关这些输入依赖项的源信息。...首先,我添加一个 eng/Version.Details 文件。然后,我使用"darc"工具确保主分支上仓库的每个新生成默认分配给".NET Core 3.0 开发"通道。...通过 Version.Details.xml 文件来构建完整的依赖关系图,我可以识别图中发生的非依赖项更改。 修复需要多长时间才能在产品中出现?

    1.4K60

    听GPT 讲Rust Cargo源代码(7)

    PathSource结构体代表一个依赖项源,它可以从本地文件系统中的路径加载依赖项。这对于开发人员在本地测试和开发自己的依赖项很有用。...Ratio: 在Basic样式的基础上添加了一个比例的显示。 NoProgress: 不显示进度条,只显示描述文本。 Percent: 只显示百分比的进度条。...该文件的作用是定义了Cargo在处理本地路径依赖项时所使用的源实现。 在Cargo中,有三种不同类型的源:Crates.io源、Git源和路径源。...路径源是一种简单的源类型,它允许使用者直接指定本地文件系统上的路径,作为依赖项的来源。...PathSource的作用是在本地文件系统上查找和解析路径依赖项的元数据、依赖关系和版本信息等,并通过Cargo的统一接口,使这些路径依赖项能够像其他源一样被管理和构建。

    8210

    Go命令官方指南【原译】

    fix  更新包以使用新API fmt  gofmt(重新格式化)包源 generate  通过源代码生成Go文件 获取下载并安装包和依赖项 安装编译和安装包和依赖项 列表列表包或模块 mod模块维护...-fix标志指示get在解析依赖项或构建代码之前在下载的包上运行修复工具。 -insecure标志允许从存储库中提取并使用不安全的方案(如HTTP)解析自定义域。谨慎使用。...验证依赖项是否具有预期内容 用法: go mod verify 验证检查当前模块的依赖关系(存储在本地下载的源缓存中)自下载以来未被修改。如果所有模块都未修改,请验证打印“所有模块已验证”。...通常,添加新的依赖项可能需要升级现有的依赖项以保持工作的构建,并且“go get”会自动执行此操作。同样,降级一个依赖项可能需要降级其他依赖项,“go get”也会自动执行此操作。...添加最新的golang.org/x/perf,然后在最新版本中安装命令。 -d标志指示get下载构建命名包所需的源代码,包括下载必要的依赖项,但不构建和安装它们。

    8.1K30
    领券