使用Bazel构建C++项目时添加gtest外部依赖报错如何解决
问题解决步骤
报错核心原因是手动在copts中硬写头文件路径的方式不符合Bazel的依赖传递规则,沙箱编译时无法正确识别外部依赖的头文件路径,按照以下步骤修改即可解决:
第一步:修改dependencies/BUILD.gtest配置
将原copts配置替换为Bazel原生的includes属性,该属性会自动将头文件路径传递给所有依赖当前库的目标,无需手动逐个配置:
cc_library( name = "main", srcs = glob( ["src/*.cc"], exclude = ["src/gtest-all.cc"] ), hdrs = glob([ "include/**/*.h", "src/*.h" ]), includes = ["include"], linkopts = ["-pthread"], visibility = ["//visibility:public"], )
第二步:修改test/BUILD配置
删除手动指定的头文件路径copts配置,修改后如下:
cc_test( name = "unittests", srcs = ["scanner_test.cc"], deps = [ "//scanner:scanner", "@gtest//:main" ] )
第三步:清理缓存重新编译
执行以下命令清除旧的依赖缓存,再重新构建即可:
bazel clean --expunge bazel build //test:unittests
可选简化方案(无需自定义BUILD.gtest)
googletest 1.10.0及以上版本已经自带官方Bazel构建配置,无需自行维护BUILD.gtest,可进一步简化配置:
- 修改WORKSPACE中的http_archive配置,删除build_file字段:
http_archive( name = "gtest", url = "https://github.com/google/googletest/archive/release-1.10.0.zip", sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91", strip_prefix = "googletest-release-1.10.0", )
- 修改test/BUILD的依赖为gtest官方提供的构建目标:
cc_test( name = "unittests", srcs = ["scanner_test.cc"], deps = [ "//scanner:scanner", "@gtest//:gtest", "@gtest//:gtest_main" ] )
内容的提问来源于stack exchange,提问作者gottlob
相关产品推荐
相关产品推荐

