我试图学习Bazel,所以我一直在用它来构建非常简单的项目,以了解它是如何工作的,以及该工具的一些细节。
目前,我有一个项目(称为Enigma)构建一个main.cpp
文件,它依赖于我编写的两个库(我这样写是为了更好地理解Bazel规则,在这个特定的项目中,拥有这些库实际上没有意义,但我离题了)。当我运行构建时,我可以检查我的bazel-bin
目录并找到:
1.由cc_binary
规则生成的二进制文件
1.我实现的cc_library
规则之一的静态库(*.a)文件
这对我来说是有意义的。我开始了一个新项目LinkedList
,我想把它构建成一个库。通过一些故障排除和研究,我决定我需要一个依赖于cc_library
规则的规则,以便Bazel实际构建它,所以我创建了另一个main.cpp
。当我运行构建时,我只从我的cc_binary
规则中得到一个二进制文件,但是没有来自我的cc_library
规则的 *.a文件。我检查了我拥有的两个BUILD
文件,没有发现任何明显的不同。两个项目的WORKSPACE
文件都是空的,并且两个项目都没有.bazelrc
文件。
下面是我的Enigma BUILD
文件的内容(它在bazel-bin
目录下生成libsignal_converter.a
):
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
cc_binary(
name = "enigma",
srcs = [ "main.cpp" ],
deps = [ ":rotor", ":plugboard" ]
)
cc_library(
name = "signal_converter",
srcs = [ "signal_converter.cpp" ],
hdrs = [ "signal_converter.h" ],
includes = [ "." ]
)
cc_library(
name = "plugboard",
hdrs = [ "plugboard.h" ],
includes = [ "." ],
deps = [ ":signal_converter" ]
)
cc_library(
name = "rotor",
hdrs = [ "rotor.h" ],
includes = [ "." ],
deps = [ ":signal_converter" ]
)
下面是Enigma项目的bazel-bin
目录的内容:
_objs
enigma
enigma-2.params
enigma.cppmap
enigma.runfiles
enigma.runfiles_manifest
libsignal_converter.a
libsignal_converter.a-2.params
plugboard.cppmap
rotor.cppmap
signal_converter.cppmap
tests.cppmap
下面是我的LinkedList BUILD
文件的内容,它只生成一个二进制文件:
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
cc_binary(
name = "dummymain",
srcs = [ "main.cpp" ],
deps = [ ":linkedlist" ]
)
cc_library(
name = "linkedlist",
hdrs = [ "node.h", "linked_list.h" ]
)
下面是LinkedList项目的bazel-bin
目录的内容:
_objs
dummymain
dummymain-2.params
dummymain.cppmap
dummymain.runfiles
dummymain.runfiles_manifest
linkedlist.cppmap
为了以防万一,我确保在main.cpp
文件中包含我的库,并初始化每个类的一个示例。我得到了典型的“未使用的变量”警告,但除此之外,它按预期构建和运行。
我的问题是为什么我的Enigma项目生成 *.a文件,而我的LinkedList项目不生成?
我如何配置我的构建,使它生成 *.a(或 .so)库文件,无论是否有依赖于它们的cc_binary
规则?
我尝试过的:起初,我的LinkedList项目BUILD
文件只包含一个cc_library
规则。(尽管我运行的是bazel build //src:linkedlist
),因为没有其他规则依赖于它,而且它是库目标(尽管我觉得我对这个假设是错误的)。为了弥补这一点,我创建了一个带有cc_binary
规则的main.cpp
文件,这似乎触发了linkedlist
目标的构建,但是我仍然没有在我的bazel-bin
中看到任何库文件。我本以为它会产生一个静态链接的二进制文件以及静态库(.a)文件,但我得到的只是二进制文件。
1条答案
按热度按时间xzlaal3s1#
"plugboard"
、"rotor"
和"linkedlist"
目标仅包含头文件。这些库中没有直接编译的文件。因此,Bazel禁止为这些库创建静态归档文件。