我使用bazel构建了一个小的c++程序,程序目录结构是这样的
.
├── bazel-bin -> /data/.cache/execroot/__main__/bazel-out/k8-fastbuild/bin
├── bazel-main -> /data/.cache/execroot/__main__
├── bazel-out -> /data/.cache/execroot/__main__/bazel-out
├── bazel-testlogs -> /data/.cache/execroot/__main__/bazel-out/k8-fastbuild/testlogs
├── BUILD
├── library
│ ├── BUILD
│ ├── foo.cc
│ └── foo.h
├── main.cpp
└── WORKSPACE
这是库中的构建文件
package(default_visibility = ["//visibility:public"])
cc_library(
name = "foo",
srcs = ["foo.cc"],
hdrs = ["foo.h"]
)
这是主目录中的BUILD文件
cc_binary(
name = "myapp",
srcs = ["main.cpp"],
deps = [
"//library:foo",
],
)
目录bazel-out/k8-fastbuild/bin的结构是这样的
.
├── library
│ ├── libfoo.a
│ ├── libfoo.a-2.params
│ ├── libfoo.so
│ ├── libfoo.so-2.params
│ └── _objs
│ └── foo
│ ├── foo.pic.d
│ └── foo.pic.o
├── myapp
├── myapp-2.params
├── myapp.runfiles
│ ├── __main__
│ │ └── myapp -> /data/.cache/execroot/__main__/bazel-out/k8-fastbuild/bin/myapp
│ └── MANIFEST
├── myapp.runfiles_manifest
└── _objs
└── myapp
├── main.pic.d
└── main.pic.o
我知道 pid 代表位置无关代码。我想知道Bazel在与main链接时是否使用libfoo.a或foo.pic.o,以及为什么bazel生成这两种类型的文件libfoo.xx和foo.pic.xx。他们有什么区别?
当我将library目录移出main,然后在WORKSPACE中使用local_repository指定library foo时,bazel构建后,我发现没有生成libfoo.xx文件,bazel-out中只能找到foo.pic.xx文件目录,
foo.pic.o
和依赖文件foo.pic.d
是编译foo.cc
的输出。传统上,目标文件被放入 ar
档案中,可以将其放入顶级共享库或二进制文件中。如果您直接 bazel build
cc_library
规则,Bazel 将编译其中的源文件并生成 ar
存档。然而,Linux 上常用的现代链接器可以直接获取目标文件,而不需要间接归档。 Bazel 检测此链接器功能并使用它来避免归档(如果可能)。在问题的示例中,仅构建顶级 myapp
不需要创建 libfoo.a
。