You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bazel 7引入预编译.so库报错:如何正确配置GoogleTest依赖?

Bazel 7编译依赖预编译GoogleTest v1.12.1失败排查

尝试用Bazel 7编译依赖预编译GoogleTest v1.12.1的简单项目,但编译持续失败,已查阅Stack Overflow、Google群组、官方文档及博客仍未解决,怀疑遗漏了某些配置。

问题说明

以预编译的GoogleTest v1.12.1为例。

文件结构

MODULE.bazel
deps/BUILD
deps/lib
deps/lib/libgtest.so
deps/lib/libgtest.so.1.12.1
deps/lib/libgtest_main.so
deps/lib/libgtest_main.so.1.12.1
deps/include
deps/include/gtest
deps/include/gtest/internal
deps/include/gtest/[...]
deps/include/gtest/gtest.h
source/BUILD
source/t.cpp

MODULE.bazel 文件

module(
    name = "mymodule",
)
bazel_dep(name = "hermetic_cc_toolchain", version = "2.2.3")

source/BUILD 文件

load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
    name = "t",
    srcs = [
        "t.cpp",
        ],
    deps = [
        "//dependencies:libgtest"
    ],
)

source/t.cpp 文件

#include "gtest/gtest.h"
int t(int argc, char *argv[])
{
    return RUN_ALL_TESTS();
}

deps/BUILD 文件

load("@rules_cc//cc:defs.bzl", "cc_import")

cc_import(
    name = "libgtest",
    hdrs = glob(["include/gtest/**/*.h"]),
    includes = ["include/gtest"],
    shared_library = "lib/libgtest.so",
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

错误信息

运行bazel build //source:t时失败,报错如下:

INFO: Analyzed target //source:t (0 packages loaded, 0 targets configured).
ERROR: /source/BUILD: Compiling source/t failed: (Exit 1): c++ failed: error executing CppCompile command (from target //source:t)

source/t.cpp:1:10: fatal error: 'gtest/gtest.h' file not found
    1 | #include "gtest/gtest.h"
      |          ^~~~~~~~~~~~~~~
1 error generated.
Target //source:t failed to build
ERROR: Build did NOT complete successfully

问题修正

有两处关键配置错误:

  1. 依赖路径错误:
    source/BUILD中依赖写的是//dependencies:libgtest,但预编译库实际目录是deps,需改为//deps:libgtest。

  2. 头文件包含路径错误:
    deps/BUILD中includes字段设置为["include/gtest"],这会让编译器直接在include/gtest目录下查找头文件,但代码中是#include "gtest/gtest.h",正确的includes应设置为["include"],这样编译器会在include目录下找到gtest子目录,从而正确解析头文件路径。

另外,建议扩大hdrs的glob范围,确保所有相关头文件都被包含:

hdrs = glob(["include/**/*.h"]),

修正后的deps/BUILD:

load("@rules_cc//cc:defs.bzl", "cc_import")

cc_import(
    name = "libgtest",
    hdrs = glob(["include/**/*.h"]),
    includes = ["include"],
    shared_library = "lib/libgtest.so",
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

修正后的source/BUILD:

load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
    name = "t",
    srcs = ["t.cpp"],
    deps = ["//deps:libgtest"],
)

内容的提问来源于stack exchange,提问作者orangesomethingorange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:55:26