gpt4 book ai didi

c++ - 没有src的Bazel cc_library不会自行编译

转载 作者:行者123 更新时间:2023-12-01 15:13:29 27 4
gpt4 key购买 nike

我有一个仅 header 的cc_library。每当我尝试自行编译此类库时,它实际上都不会编译任何内容。我故意放一些错误,以尝试在编译时获得此类错误,但bazel实际上并未编译任何内容。这是一个小例子。

// test.h

This should not compile fdsafdsafdsa
int foo() { return 1; }

# BUILD

cc_library(
name = 'test',
hdrs = ['test.h']
)
// bazel build :test
INFO: Analyzed target //:test (2 packages loaded, 3 targets configured).
INFO: Found 1 target...
Target //:test up-to-date (nothing to build)
INFO: Elapsed time: 0.083s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

这是故意行为吗?

我还进行了相同的实验,但拆分了.h和.cc文件,在这种情况下,编译时出现了错误。

最佳答案

cc_library(例如其他规则,也包括pkg_tar)不必具有任何来源。这也是有效的:

cc_library(
name = "empty",
srcs = [],
)

它实际上也非常有用。您可能具有可配置的属性,例如 deps(或 srcs),其中实际内容仅适用于某些条件:
cc_binary(
name = "mybinary",
srcs = ["main.c"],
deps = select({
":platform1": [":some_plat1_only_lib"],
":platform2": [":empty"], # as defined in the above snippet
}),
)

或者(因为上面您可能已经将 []用作 :platform2 deps了),如果您有一棵更大的树,并且您希望开发人员仅依赖 //somelib:somelib,则可以通过 alias使用此空库为他们提供单个标签,而不必担心所有平台特定的细节以及在以下情况下如何处理提供某些功能的问题:
# somelib/BUILD:
alias(
name = "somelib",
actual = select({
":platform1": [":some_plat1_only_lib"],
":platform2": [":empty"], # as defined in the above snippet
}),
visibility = ["//visibility:public"], # set appropriately
)
mybinary或任何其他目标现在可以说:
cc_binary(
name = "mybinary",
srcs = ["main.c"],
deps = ["//somelib"],
)

当然,正如这里的另一个答案所指出的,只有 header 库。

同样在问题中使用的示例中。 (是否为 bazel),您通常不会(也不会很有用)自行编译头文件。您仅会使用其内容,然后才能看到编译器在尝试构建 header 是 #include d的源时失败。那是 bazel build失败的原因,另一个目标必须依赖 test#include "test.h"

关于c++ - 没有src的Bazel cc_library不会自行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60244695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com