Bazel build 为什么会生成 .pic.o 和 .pic.d 文件,它们的用途是什么?

问题描述 投票:0回答:1

我使用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文件目录,

compilation bazel
1个回答
0
投票
目标文件

foo.pic.o
和依赖文件
foo.pic.d
是编译
foo.cc
的输出。传统上,目标文件被放入
ar
档案中,可以将其放入顶级共享库或二进制文件中。如果您直接
bazel build
cc_library
规则,Bazel 将编译其中的源文件并生成
ar
存档。然而,Linux 上常用的现代链接器可以直接获取目标文件,而不需要间接归档。 Bazel 检测此链接器功能并使用它来避免归档(如果可能)。在问题的示例中,仅构建顶级
myapp
不需要创建
libfoo.a

© www.soinside.com 2019 - 2024. All rights reserved.