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
问题修正
有两处关键配置错误:
依赖路径错误:
source/BUILD中依赖写的是//dependencies:libgtest,但预编译库实际目录是deps,需改为//deps:libgtest。头文件包含路径错误:
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
相关产品推荐
相关产品推荐

