c++ 一个Bazel项目生成二进制和静态库文件,另一个类似的项目只生成二进制文件

zf9nrax1  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(218)

我试图学习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)文件,但我得到的只是二进制文件。

xzlaal3s

xzlaal3s1#

"plugboard""rotor""linkedlist"目标仅包含头文件。这些库中没有直接编译的文件。因此,Bazel禁止为这些库创建静态归档文件。

相关问题