规则
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
查看规则来源cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
它会生成一个可执行的二进制文件。
目标的
name
应与
作为应用主要入口点的源文件(去掉扩展名)。
例如,如果您的入口点是 main.cc
,则您的姓名应
为 main
。
隐式输出目标
name.stripped
(仅在明确请求时构建):剥离 二进制文件版本。对二进制文件运行strip -g
以移除调试 符号。您可以使用以下命令在命令行中提供其他剥离选项:--stripopt=-foo
。name.dwp
(仅在明确请求时构建):如果 已启用 Fission:调试 信息包文件。否则: 空白文件。
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 这些值可以是 |
srcs
|
标签列表;默认值为 所有 纯汇编程序文件(.s、.asm)不会进行预处理,并且通常使用 汇编程序预处理的汇编文件 (.S) 会经过预处理,并且通常是 使用 C/C++ 编译器编写代码。
所有
如果
允许的
...以及生成这些文件的任何规则(例如 |
data
|
标签列表;默认值为 data 的一般评论
大多数构建规则。
如果 如果 您的 C++ 代码可以像这样访问这些数据文件:
|
additional_linker_inputs
|
标签列表;默认值为 例如,您可以在此处提供经过编译的 Windows .res 文件, 二进制目标。 |
copts
|
字符串列表;默认值为
此属性中的每个字符串都会按照指定顺序添加到
如果该软件包声明了 feature,
|
defines
|
字符串列表;默认值为 -D ,并添加到编译命令行中,
以及依赖于该规则的每条规则请务必小心,
产生深远的影响。如有疑问,请将定义值添加到
local_defines 。
|
dynamic_deps
|
标签列表;默认值为 cc_shared_library 依赖项。
|
hdrs_check
|
String;默认值为 |
includes
|
字符串列表;默认值为 -isystem path_to_package/include_entry 。
它只能用于
不符合 Google 的 #include 语句写作风格。
与 COPTS 不同,系统会为此规则添加这些标记
以及依赖于它的所有规则(注意:并非其所依赖的规则!)是
必须格外小心,因为这可能会造成深远的影响。如有疑问,请添加
“-I”标志更改为 COPTS。
添加的 |
link_extra_lib
|
标签;默认值为
默认情况下,C++ 二进制文件链接到 |
linkopts
|
字符串列表;默认值为 LINKOPTS 中,
链接二进制目标。
此列表中将出现每个不以 |
linkshared
|
布尔值;默认值为 linkshared=True 。默认情况下
此选项处于停用状态
此标志的存在表示使用
如果您同时指定 |
linkstatic
|
布尔值;默认值为 cc_binary 和
cc_test :以静态方式关联二进制文件
模式。对于 cc_library.link_static :请参阅下文。
默认情况下,系统会为
如果已启用,并且是二进制文件或测试文件,此选项将指示构建工具加入
尽可能为用户库使用 关联可执行文件其实有三种不同的方法:
如果
在生产环境中使用 |
local_defines
|
字符串列表;默认值为 -D ,并添加到此目标的编译命令行中,
但不向其依赖项传递。
|
malloc
|
标签;默认值为
默认情况下,C++ 二进制文件链接到 |
module_interfaces
|
标签列表;默认值为 C++ Standard 对模块接口文件扩展名没有限制
使用由标志保护
|
nocopts
|
String;默认值为 COPTS
(包括规则的 copts 属性中明确指定的值)
将从 COPTS 中移除,以便编译此规则。
不需要或使用此属性
third_party 之外。这些值未经过预处理
除“品牌”变量替换。
|
reexport_deps
|
标签列表;默认值为 |
stamp
|
整数;默认值为
除非其依赖项发生变化,否则带时间戳的二进制文件不会被重新构建。 |
win_def_file
|
标签;默认值为 仅当 Windows 是目标平台时,才应使用此属性。 它可用于 导出符号。 |
cc_import
查看规则来源cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)
cc_import
规则允许用户导入预编译的 C/C++ 库。
以下是典型的用例:
1.关联静态库
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
# If alwayslink is turned on,
# libmylib.a will be forcely linked into any binary that depends on it.
# alwayslink = 1,
)
2.关联共享库 (Unix)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
3.将共享库与接口库相关联
在 Unix 上:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# libmylib.ifso is an interface library for libmylib.so which will be passed to linker
interface_library = "libmylib.ifso",
# libmylib.so will be available for runtime
shared_library = "libmylib.so",
)
在 Windows 上:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is an import library for mylib.dll which will be passed to linker
interface_library = "mylib.lib",
# mylib.dll will be available for runtime
shared_library = "mylib.dll",
)
4.将共享库与 system_provided=True
关联
在 Unix 上:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
# libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
# This indicates that Bazel is not responsible for making libmylib.so available.
system_provided = 1,
)
在 Windows 上:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is an import library for mylib.dll which will be passed to linker
interface_library = "mylib.lib",
# mylib.dll is provided by system environment, for example it can be found in PATH.
# This indicates that Bazel is not responsible for making mylib.dll available.
system_provided = 1,
)
5.链接到静态库或共享库
在 Unix 上:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
在 Windows 上:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.lib", # A normal static library
interface_library = "mylib.lib", # An import library for mylib.dll
shared_library = "mylib.dll",
)
其余命令在 Unix 和 Windows 上是相同的:
# first will link to libmylib.a (or libmylib.lib)
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = 1, # default value
)
# second will link to libmylib.so (or libmylib.lib)
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = 0,
)
cc_import
支持 include 属性。例如:
cc_import(
name = "curl_lib",
hdrs = glob(["vendor/curl/include/curl/*.h"]),
includes = ["vendor/curl/include"],
shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 deps 的一般评论
大多数构建规则。
|
hdrs
|
标签列表;默认值为 |
alwayslink
|
布尔值;默认值为 如果 alwayslink 无法用于 Windows 上的 VS 2017,原因在于 已知问题, 请将 VS 2017 升级到最新版本。 |
includes
|
字符串列表;默认值为 -isystem path_to_package/include_entry 。
它只能用于
不符合 Google 的 #include 语句写作风格。
与 COPTS 不同,系统会为此规则添加这些标记
以及依赖于它的所有规则(注意:并非其所依赖的规则!)是
必须格外小心,因为这可能会造成深远的影响。如有疑问,请添加
“-I”标志更改为 COPTS。
默认 |
interface_library
|
标签;默认值为 允许的文件类型:
|
linkopts
|
字符串列表;默认值为 LINKOPTS 中,
链接二进制目标。
此列表中将出现每个不以 |
objects
|
标签列表;默认值为 |
pic_objects
|
标签列表;默认值为 |
pic_static_library
|
标签;默认值为 |
shared_library
|
标签;默认值为 允许的文件类型:
|
static_library
|
标签;默认值为 允许的文件类型:
|
system_provided
|
布尔值;默认值为 interface_library ,
“shared_library ”应该为空。
|
cc_library
查看规则来源cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
对于由 C++ 编译的库,请使用 cc_library()
。
结果是 .so
、.lo
、
或 .a
,具体取决于具体需求。
如果您使用依赖于
cc_library
,依赖的库规则的输出
是 .a
文件。如果您指定
alwayslink=True
,您会获得 .lo
文件。
对于libfoo.so
共享库,其中 foo 是规则的名称。通过
其他类型的库以 .lo
和 .a
结尾,
。如果您需要一个特定的共享库名称,
例如,要定义一个 Python 模块,可以使用 Genrule 来复制库
更改为所需的名称。
标头包含性检查
build 中使用的所有头文件都必须在
cc_*
规则的 hdrs
或 srcs
。
这是强制执行的。
对于 cc_library
规则,hdrs
中的标头包括
库的公共接口,并且可以直接包含
从库的 hdrs
和 srcs
的文件中获取
以及来自 hdrs
和 srcs
的文件中
(共 cc_*
条规则,这些规则在其 deps
中列出该库)。
srcs
中的头文件只能直接从文件中包含在内
在库本身的 hdrs
和 srcs
中。时间
决定是将标头放入 hdrs
还是 srcs
,
您应询问是否希望此库的使用方能够
直接包含它这与
public
到 private
的编程语言的可见性。
未导出 cc_binary
和 cc_test
规则
接口,因此它们也没有 hdrs
属性。所有标头
或直接测试的所有文件应列在
srcs
。
为了说明这些规则,请看以下示例。
cc_binary(
name = "foo",
srcs = [
"foo.cc",
"foo.h",
],
deps = [":bar"],
)
cc_library(
name = "bar",
srcs = [
"bar.cc",
"bar-impl.h",
],
hdrs = ["bar.h"],
deps = [":baz"],
)
cc_library(
name = "baz",
srcs = [
"baz.cc",
"baz-impl.h",
],
hdrs = ["baz.h"],
)
下表列出了此示例中允许的直接包含项。
例如,foo.cc
可以直接
包含 foo.h
和 bar.h
,但不包含 baz.h
。
包括文件 | 允许的包含项 |
---|---|
foo.h | bar.h |
foo.cc | foo.h bar.h |
bar.h | bar-impl.h,baz.h |
bar-impl.h | bar.h baz.h |
bar.cc | bar.h bar-impl.h baz.h |
baz.h | baz-impl.h |
baz-impl.h | baz.h |
baz.cc | baz.h baz-impl.h |
包含检查规则仅适用于直接
包含。在上面的示例中,foo.cc
可以
包括bar.h
,其中可能包括baz.h
,
允许 turn 包含 baz-impl.h
。从技术上讲
编译 .cc
文件可能会以传递方式包含任何头文件
文件放在 hdrs
或 srcs
传递 deps
闭包中的任何 cc_library
。在
在这种情况下,编译器可能会读取 baz.h
和 baz-impl.h
编译 foo.cc
时,但 foo.cc
不得
包含“#include "baz.h"
”。为此
允许,必须将 baz
添加到 deps
共 foo
个。
Bazel 依赖于工具链支持来强制执行包含检查规则。
工具链必须支持 layering_check
功能
并明确请求调用,例如通过
--features=layering_check
命令行标志或
features
参数的
package
函数。工具链
在 Unix 和 macOS 上,Bazel 提供的仅支持使用 Clang 的 Clang 语言。
示例
我们使用 alwayslink
标志强制链接器
但主二进制代码不会引用它
cc_library(
name = "ast_inspector_lib",
srcs = ["ast_inspector_lib.cc"],
hdrs = ["ast_inspector_lib.h"],
visibility = ["//visibility:public"],
deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
# alwayslink as we want to be able to call things in this library at
# debug time, even if they aren't used anywhere in the code.
alwayslink = 1,
)
以下示例来自
third_party/python2_4_3/BUILD
。
部分代码使用 dl
库(从
另一个动态库),所以这个
规则指定 -ldl
链接选项,以链接
dl
库。
cc_library(
name = "python2_4_3",
linkopts = [
"-ldl",
"-lutil",
],
deps = ["//third_party/expat"],
)
以下示例来自 third_party/kde/BUILD
。
我们将预构建的 .so
文件保存在库中。
头文件位于名为 include
的子目录中。
cc_library(
name = "kde",
srcs = [
"lib/libDCOP.so",
"lib/libkdesu.so",
"lib/libkhtml.so",
"lib/libkparts.so",
...more .so files...,
],
includes = ["include"],
deps = ["//third_party/X11"],
)
以下示例来自 third_party/gles/BUILD
。
第三方代码通常需要一些 defines
和
linkopts
。
cc_library(
name = "gles",
srcs = [
"GLES/egl.h",
"GLES/gl.h",
"ddx.c",
"egl.c",
],
defines = [
"USE_FLOAT",
"__GL_FLOAT",
"__GL_COMMON",
],
linkopts = ["-ldl"], # uses dlopen(), dl library
deps = [
"es",
"//third_party/X11",
],
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 这些目标可以是 查看关于 这些应该是 C++ 库规则的名称。
当您构建关联此规则库的二进制文件时,
您还需要关联 尽管“依赖项”并非此库的所有客户端
都属于这里。运行时数据依赖项属于 要关联预编译的第三方库,请将其名称添加到
要在不将其关联至此库的情况下依赖于某个资源,请将其
改为 |
srcs
|
标签列表;默认值为 所有 纯汇编程序文件(.s、.asm)不会进行预处理,并且通常使用 汇编程序预处理的汇编文件 (.S) 会经过预处理,并且通常是 使用 C/C++ 编译器编写代码。
所有
如果
允许的
...以及生成这些文件的任何规则(例如 |
data
|
标签列表;默认值为 data 的一般评论
大多数构建规则。
如果 如果 您的 C++ 代码可以像这样访问这些数据文件:
|
hdrs
|
标签列表;默认值为 这是声明
描述该库的接口这些标头
以供来源添加到此规则或依赖规则中。
此库的客户端不应包含的标头应
在 允许的 |
additional_compiler_inputs
|
标签列表;默认值为 |
additional_linker_inputs
|
标签列表;默认值为 例如,您可以在此处提供经过编译的 Windows .res 文件, 二进制目标。 |
alwayslink
|
布尔值;默认值为 srcs ,即使其中一些不包含二进制文件引用的符号也是如此。
如果
二进制文件。例如,如果您的代码注册以接收一些回调
提供的服务
如果 alwayslink 无法用于 Windows 上的 VS 2017,原因在于 已知问题, 请将 VS 2017 升级到最新版本。 |
copts
|
字符串列表;默认值为
此属性中的每个字符串都会按照指定顺序添加到
如果该软件包声明了 feature,
|
defines
|
字符串列表;默认值为 -D ,并添加到编译命令行中,
以及依赖于该规则的每条规则请务必小心,
产生深远的影响。如有疑问,请将定义值添加到
local_defines 。
|
hdrs_check
|
String;默认值为 |
implementation_deps
|
标签列表;默认值为 deps ,这些库(及其所有库)的头文件和 include 路径
传递依赖项)仅用于编译此库,而不会用于
一切都依赖于它使用 implementation_deps 指定的库仍然链接到
依赖于此库的二进制文件目标
目前,此用法仅限于 cc_library,并由标志保护
|
include_prefix
|
String;默认值为 设置后,此规则的 先移除 此属性仅在 |
includes
|
字符串列表;默认值为 -isystem path_to_package/include_entry 。
它只能用于
不符合 Google 的 #include 语句写作风格。
与 COPTS 不同,系统会为此规则添加这些标记
以及依赖于它的所有规则(注意:并非其所依赖的规则!)是
必须格外小心,因为这可能会造成深远的影响。如有疑问,请添加
“-I”标志更改为 COPTS。
添加的 |
linkopts
|
字符串列表;默认值为 cc_binary.linkopts 。
linkopts 属性还会应用于
通过 deps 直接或间接依赖于此库
属性(或通过其他以类似方式处理的属性):
malloc
cc_binary 的属性)。依赖项
linkopt 优先于从属 linkopt(即附属 linkopt)
稍后在命令行中显示)。中指定的 Linkopt
--linkopt
规则链接优化
请注意, 另外,需要注意的是,“-Wl,-soname”或“-Xlinker -soname” 选项不受支持,且绝不应在此属性中指定选项。 |
linkstamp
|
标签;默认值为 base 软件包。
|
linkstatic
|
布尔值;默认值为 cc_binary 和
cc_test :以静态方式关联二进制文件
模式。对于 cc_library.link_static :请参阅下文。
默认情况下,系统会为
如果已启用,并且是二进制文件或测试文件,此选项将指示构建工具加入
尽可能为用户库使用 关联可执行文件其实有三种不同的方法:
如果
在生产环境中使用 |
local_defines
|
字符串列表;默认值为 -D ,并添加到此目标的编译命令行中,
但不向其依赖项传递。
|
module_interfaces
|
标签列表;默认值为 C++ Standard 对模块接口文件扩展名没有限制
使用由标志保护
|
strip_include_prefix
|
String;默认值为 设置后,此规则的 如果是相对路径,则会被当作软件包相对路径。如果它是绝对的, 系统会将它理解为代码库相对路径。
此属性仅在 |
textual_hdrs
|
标签列表;默认值为 此位置用于声明无法自行编译的头文件; 也就是说,它们始终需要由其他源文件以文本形式包含,才能构建有效的 代码。 |
win_def_file
|
标签;默认值为 仅当 Windows 是目标平台时,才应使用此属性。 它可用于 导出符号。 |
cc_proto_library
查看规则来源cc_proto_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
cc_proto_library
从 .proto
文件生成 C++ 代码。
deps
必须指向 proto_library
规则。
示例:
cc_library(
name = "lib",
deps = [":foo_cc_proto"],
)
cc_proto_library(
name = "foo_cc_proto",
deps = [":foo_proto"],
)
proto_library(
name = "foo_proto",
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 proto_library 的列表
为其生成 C++ 代码的规则。
|
cc_shared_library
查看规则来源cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)
它会生成一个共享库。
示例
cc_shared_library( name = "foo_shared", deps = [ ":foo", ], dynamic_deps = [ ":bar_shared", ], additional_linker_inputs = [ ":foo.lds", ], user_link_flags = [ "-Wl,--version-script=$(location :foo.lds)", ], ) cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], deps = [ ":bar", ":baz", ], ) cc_shared_library( name = "bar_shared", shared_lib_name = "bar.so", deps = [":bar"], ) cc_library( name = "bar", srcs = ["bar.cc"], hdrs = ["bar.h"], ) cc_library( name = "baz", srcs = ["baz.cc"], hdrs = ["baz.h"], )
在此示例中,foo_shared
静态链接 foo
和 baz
,后者是传递依赖项。没有
关联 bar
,因为它已由
dynamic_dep
bar_shared
。
foo_shared
使用链接器脚本 *.lds 文件来控制
的所有文件。cc_shared_library
规则逻辑
不控制要导出哪些符号,它仅使用
以便在分析阶段出错(如果两个共享库导出
相同的目标。
假定 cc_shared_library
的每个直接依赖项如下:
已导出。因此,Bazel 在分析期间假定 foo
由foo_shared
导出。baz
不会假定会被导出
上传者:foo_shared
。与exports_filter
匹配的每个目标
导出的数据也会被视为导出。
示例中的每个 cc_library
最多只能出现在一个
cc_shared_library
。如果还要将 baz
也关联到
bar_shared
,我们需要添加
tags = ["LINKABLE_MORE_THAN_ONCE"]
到 baz
。
由于 shared_lib_name
属性,
bar_shared
的名称将为 bar.so
,而不是
更改为其在 Linux 上的默认名称 libbar.so
。
错误
Two shared libraries in dependencies export the same symbols.
只要您使用两个不同的标准选项创建
导出相同目标的 cc_shared_library
依赖项。解决这一问题
您需要阻止系统在某个环境中
cc_shared_library
依赖项。
Two shared libraries in dependencies link the same library statically
每当您使用两个属性创建新的 cc_shared_library
时,就会发生这种情况。
以静态方式链接同一目标的不同 cc_shared_library
依赖项。
类似于导出错误。
解决此问题的一种方法是停止将库链接到某个
cc_shared_library
依赖项。与此同时,仍将
需要导出库,确保未关联库的库
符号。另一种方法是提取用于导出目标的第三个库。
第三种方法是使用 LINKABLE_MORE_THAN_ONCE
标记罪魁祸首 cc_library
但很少会进行这种修复,您一定要确保
cc_library
确实可以放心地关联多次。
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
这意味着,您的 deps
的传递闭包中的库是可访问的
而无需通过某个 cc_shared_library
依赖项,但已
已与dynamic_deps
中的其他cc_shared_library
相关联,并且未
已导出。
解决方法是将其从 cc_shared_library
依赖项中导出或拉取
第三个 cc_shared_library
,用于导出该数据。
Do not place libraries which only contain a precompiled dynamic library in deps.
如果您有预编译的动态库,则不需要,也不可能
静态关联到您当前的 cc_shared_library
目标
。因此,它不属于deps
cc_shared_library
。如果此预编译动态库是某个应用的依赖项,
cc_libraries
,则cc_library
需要依赖
。
Trying to export a library already exported by a different shared library
如果您在当前规则中声明要导出 目标。
要解决此问题,请从 deps
中移除该定位条件,只需从动态
依赖项或确保 exports_filter
不会捕获此目标。
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为
这些直接依赖项的任何传递库依赖项都将链接到此共享
但前提是它们尚未被
在分析过程中,规则实施会考虑
每当以静态方式链接到同一库时,此实现也会触发错误
转换为多个 |
additional_linker_inputs
|
标签列表;默认值为 user_link_flags 属性执行此操作。
|
dynamic_deps
|
标签列表;默认值为 cc_shared_library 依赖项。
|
experimental_disable_topo_sort_do_not_use_remove_before_7_0
|
布尔值;默认值为 |
exports_filter
|
字符串列表;默认值为
任何目标
请注意,此属性实际上并没有为这些目标添加依赖关系,
应改为由 允许使用以下语法:
|
roots
|
标签列表;默认值为 |
shared_lib_name
|
String;默认值为 |
static_deps
|
字符串列表;默认值为 |
user_link_flags
|
字符串列表;默认值为
|
win_def_file
|
标签;默认值为 仅当 Windows 是目标平台时,才应使用此属性。 它可用于 导出符号。 |
cc_static_library
查看规则来源cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)从目标及其传递依赖项的列表生成静态库。
生成的静态库包含
deps
及其传递依赖项,优先采用
PIC
对象。
输出组
linkdeps
一个文本文件,包含 中所列目标的传递依赖项的标签。
deps
:没有向静态库贡献任何对象文件,但执行了
提供至少一个静态库、动态库或接口库。生成的静态库
这些库可能需要在关联时可用。
linkopts
一个文本文件,包含用户提供的所有传递词的 linkopts
deps
中列出的目标的依赖项。
符号重复
默认情况下,cc_static_library
规则会检查生成的静态变量
库不包含任何重复的符号。如果是,构建会失败并显示错误
消息,其中列出了重复符号和包含这些符号的对象文件。
可以按目标或软件包停用此检查,方法是设置
features = ["-symbol_check"]
或通过
--features=-symbol_check
。
symbol_check
的工具链支持
Bazel 随附的自动配置的 C++ 工具链支持
所有平台上的 symbol_check
功能。自定义工具链可以添加对
通过以下两种方式之一来保存数据:
- 实现
ACTION_NAMES.validate_static_library
操作并 则可通过symbol_check
功能启用该功能。操作中的工具集是 使用两个参数调用的静态库,用于检查是否存在重复的符号和 路径。 - 让
symbol_check
功能添加归档程序标志,这些标志会导致 创建静态库的操作在出现重复符号时失败。
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 不提供任何对象文件的依赖项不会包含在静态
但其标签收集在
|
cc_test
查看规则来源cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
cc_test()
规则可编译测试。在这里,
是一些测试代码的二进制封装容器
默认情况下,C++ 测试是动态链接的。
如需静态链接单元测试,请指定
linkstatic=True
。
最好说明为什么您的测试需要
linkstatic
;这一点可能并不明显
隐式输出目标
name.stripped
(仅在明确请求时构建):剥离 二进制文件版本。对二进制文件运行strip -g
以移除调试 符号。您可以使用以下命令在命令行中提供其他剥离选项:--stripopt=-foo
。name.dwp
(仅在明确请求时构建):如果 已启用 Fission:调试 信息包文件。否则: 空白文件。
请参阅 cc_binary() 参数,但以下情况除外:
对于测试,stamp
参数默认设置为 0,并且
cc_test
有多余的
所有测试规则通用的属性 (*_test)。
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
deps
|
标签列表;默认值为 这些值可以是 |
srcs
|
标签列表;默认值为 所有 纯汇编程序文件(.s、.asm)不会进行预处理,并且通常使用 汇编程序预处理的汇编文件 (.S) 会经过预处理,并且通常是 使用 C/C++ 编译器编写代码。
所有
如果
允许的
...以及生成这些文件的任何规则(例如 |
data
|
标签列表;默认值为 data 的一般评论
大多数构建规则。
如果 如果 您的 C++ 代码可以像这样访问这些数据文件:
|
additional_linker_inputs
|
标签列表;默认值为 例如,您可以在此处提供经过编译的 Windows .res 文件, 二进制目标。 |
copts
|
字符串列表;默认值为
此属性中的每个字符串都会按照指定顺序添加到
如果该软件包声明了 feature,
|
defines
|
字符串列表;默认值为 -D ,并添加到编译命令行中,
以及依赖于该规则的每条规则请务必小心,
产生深远的影响。如有疑问,请将定义值添加到
local_defines 。
|
dynamic_deps
|
标签列表;默认值为 cc_shared_library 依赖项。
|
hdrs_check
|
String;默认值为 |
includes
|
字符串列表;默认值为 -isystem path_to_package/include_entry 。
它只能用于
不符合 Google 的 #include 语句写作风格。
与 COPTS 不同,系统会为此规则添加这些标记
以及依赖于它的所有规则(注意:并非其所依赖的规则!)是
必须格外小心,因为这可能会造成深远的影响。如有疑问,请添加
“-I”标志更改为 COPTS。
添加的 |
link_extra_lib
|
标签;默认值为
默认情况下,C++ 二进制文件链接到 |
linkopts
|
字符串列表;默认值为 LINKOPTS 中,
链接二进制目标。
此列表中将出现每个不以 |
linkshared
|
布尔值;默认值为 linkshared=True 。默认情况下
此选项处于停用状态
此标志的存在表示使用
如果您同时指定 |
linkstatic
|
布尔值;默认值为 cc_binary 和
cc_test :以静态方式关联二进制文件
模式。对于 cc_library.link_static :请参阅下文。
默认情况下,系统会为
如果已启用,并且是二进制文件或测试文件,此选项将指示构建工具加入
尽可能为用户库使用 关联可执行文件其实有三种不同的方法:
如果
在生产环境中使用 |
local_defines
|
字符串列表;默认值为 -D ,并添加到此目标的编译命令行中,
但不向其依赖项传递。
|
malloc
|
标签;默认值为
默认情况下,C++ 二进制文件链接到 |
module_interfaces
|
标签列表;默认值为 C++ Standard 对模块接口文件扩展名没有限制
使用由标志保护
|
nocopts
|
String;默认值为 COPTS
(包括规则的 copts 属性中明确指定的值)
将从 COPTS 中移除,以便编译此规则。
不需要或使用此属性
third_party 之外。这些值未经过预处理
除“品牌”变量替换。
|
reexport_deps
|
标签列表;默认值为 |
stamp
|
整数;默认值为
除非其依赖项发生变化,否则带时间戳的二进制文件不会被重新构建。 |
win_def_file
|
标签;默认值为 仅当 Windows 是目标平台时,才应使用此属性。 它可用于 导出符号。 |
cc_toolchain
查看规则来源cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)
表示 C++ 工具链。
此规则负责:
-
收集运行 C++ 操作所需的所有工件。这是通过
属性,例如
all_files
、compiler_files
、linker_files
或以_files
结尾的其他属性)。这些是 最常见的文件组。 -
为 C++ 操作生成正确的命令行。为此,您可以使用
CcToolchainConfigInfo
提供方(详见下文)。
使用 toolchain_config
属性配置 C++ 工具链。
另请参阅此内容
页
,获取详细的 C++ 工具链配置和工具链选择文档。
使用 tags = ["manual"]
以防止构建和配置工具链
在调用 bazel build //...
时不必要的
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
all_files
|
标签;必需 所有 cc_toolchain 工件的集合。这些工件将作为输入添加到 rules_cc 相关操作(使用更精确的 来自以下属性)。Bazel 假定all_files 是一个超集
所有其他提供工件的属性(例如,Linktamp 编译需要同时编译
和链接文件,因此需要 all_files )。
这是 |
ar_files
|
标签;默认值为 |
as_files
|
标签;默认值为 |
compiler_files
|
标签;必需 编译操作所需的所有 cc_toolchain 工件的集合。 |
compiler_files_without_includes
|
标签;默认值为 |
coverage_files
|
标签;默认值为 |
dwp_files
|
标签;必需 dwp 操作所需的所有 cc_toolchain 工件的集合。 |
dynamic_runtime_lib
|
标签;默认值为 当“static_link_cpp_runtimes”功能已启用,我们将 动态依赖项。 |
exec_transition_for_inputs
|
布尔值;默认值为 |
libc_top
|
标签;默认值为 |
linker_files
|
标签;必需 关联操作所需的所有 cc_toolchain 工件的集合。 |
module_map
|
标签;默认值为 |
objcopy_files
|
标签;必需 objcopy 操作所需的所有 cc_toolchain 工件的集合。 |
output_licenses
|
字符串列表;默认值为 |
static_runtime_lib
|
标签;默认值为 当“static_link_cpp_runtimes”功能已启用,我们将 依赖项。 |
strip_files
|
标签;必需 删除操作所需的全部 cc_toolchain 工件的集合。 |
supports_header_parsing
|
布尔值;默认值为 |
supports_param_files
|
布尔值;默认值为 |
toolchain_config
|
标签;必需 提供cc_toolchain_config_info 的规则的标签。
|
toolchain_identifier
|
String;默认值为
直到问题 #5380 得到解决
这是将 |
cc_toolchain_suite
查看规则来源cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
已弃用:该规则为空操作,将被移除。
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
fdo_prefetch_hints
查看规则来源fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
表示工作区中的 FDO 预提取提示配置文件。 示例:
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
profile
|
标签;必需 提示分析的标签。提示文件的扩展名为 .afdo 该标签还可以指向 fdo_绝对_path_profile 规则。 |
fdo_profile
查看规则来源fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
表示工作区中的 FDO 配置文件。 示例:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
memprof_profile
|
标签;默认值为 |
profile
|
标签;必需 FDO 配置文件的标签或生成该配置文件的规则。FDO 文件可以包含 以下扩展名:.profraw 表示未编入索引的 LLVM 配置文件,.profdata 表示已编入索引的 LLVM 配置文件、包含 LLVM Profraw 配置文件的 .zip、用于 AutoFDO 配置文件的 .afdo、用于 XBinary 配置文件。该标签还可以指向 fdo_绝对_path_profile 规则。 |
proto_profile
|
标签;默认值为 |
memprof_profile
查看规则来源memprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
表示工作区中的 MEMPROF 配置文件。 示例:
memprof_profile(
name = "memprof",
profile = "//path/to/memprof:profile.afdo",
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
profile
|
标签;必需 MEMPROF 配置文件的标签。配置文件应包含 .profdata 扩展名(适用于编入索引/符号化的 memprof) 或包含 memprof .profdata 的 zip 文件的.zip 扩展名 文件。 该标签还可以指向 fdo_绝对_path_profile 规则。 |
propeller_optimize
查看规则来源propeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
表示工作区中的 Propeller 优化配置文件。 示例:
propeller_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
参数
属性 | |
---|---|
name |
姓名;必需 此目标的唯一名称。 |
cc_profile
|
标签;必需 传递给各种编译操作的配置文件的标签。此文件包含 .txt 扩展名。 |
ld_profile
|
标签;必需 传递给关联操作的个人资料的标签。此文件包含 .txt 扩展名。 |