无法通过Bazel的ios_unit_test规则运行C++测试的问题求助
尝试通过Google Test库添加C测试,并通过ios_unit_test目标运行,但测试完全未执行。试过直接集成C测试库,或通过objc_library集成,两种方式都无效。相关配置如下:
Module.bzl
module( name = "bazelsample", version = "0.0.1", repo_name = "bazel_sample" ) bazel_dep(name = "apple_support", version = "1.15.1") bazel_dep(name = "rules_apple", version = "3.5.1", repo_name="build_bazel_rules_apple") bazel_dep(name = "rules_ios", version = "4.4.0", repo_name="build_bazel_rules_ios") bazel_dep(name = "googletest", version = "1.14.0")
BUILD
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") load("@rules_cc//cc:defs.bzl", "cc_library") cc_library( name = "cpp_tests_lib", srcs = [ "cpp_tests_lib/cpp_test.cpp", ], deps = [ "@googletest//:gtest", "@googletest//:gtest_main", ], visibility = ["//visibility:public"], ) objc_library( name = "objc_tests_lib", srcs = [ "objc_tests_lib/GoogleTests.mm", ], deps = [ ":cpp_tests_lib", "@googletest//:gtest", "@googletest//:gtest_main", ], visibility = ["//visibility:public"], sdk_frameworks = ["XCTest"], ) objc_library( name = "objc_cpp_tests_lib", srcs = [ "cpp_tests_lib/cpp_test.cpp", "objc_tests_lib/GoogleTests.mm", ], deps = [ "@googletest//:gtest", "@googletest//:gtest_main", ], visibility = ["//visibility:public"], sdk_frameworks = ["XCTest"], ) ios_unit_test( name = "ios_cpp_tests_lib", minimum_os_version = "17.0", deps = [":cpp_tests_lib"], visibility = ["//visibility:public"], ) ios_unit_test( name = "ios_objc_tests_lib", minimum_os_version = "17.0", deps = [":objc_tests_lib"], visibility = ["//visibility:public"], ) ios_unit_test( name = "ios_objc_cpp_tests_lib", minimum_os_version = "17.0", deps = [":objc_cpp_tests_lib"], visibility = ["//visibility:public"], )
C++测试代码(cpp_test.cpp)
#include <gtest/gtest.h> TEST(YourTestSuite, YourTestCase) { EXPECT_EQ(2 + 2, 4); } TEST(YourTestSuite, YourTestCaseTwo) { EXPECT_EQ(2 + 2, 4); }
使用GoogleTests.mm文件在运行时连接C++ Google测试与XCTest,但运行时C测试未加载到Google Test库中,经确认:除非从ObjC测试类调用,否则C测试代码完全不会执行。
请问是否遗漏了某些步骤,或者是否无法通过ios_unit_test规则集成并运行C++测试?
以下是修复C++测试在ios_unit_test中不执行的关键步骤:
移除
gtest_main依赖gtest_main会提供独立的main函数,与iOS单元测试由XCTest框架管理入口的逻辑冲突。需删除所有@googletest//:gtest_main依赖,改用GoogleTests.mm中的逻辑触发GTest运行。确保C++测试代码被正确链接
在objc_library中包含C测试源文件时,需添加C标准编译参数,确保Bazel正确处理C++代码。同时保证GoogleTests.mm中正确实现GTest的初始化与运行逻辑:#import <XCTest/XCTest.h> #include <gtest/gtest.h> @interface GoogleTests : XCTestCase @end @implementation GoogleTests - (void)testGoogleTests { testing::InitGoogleTest(); int argc = 0; char** argv = nullptr; RUN_ALL_TESTS(); } @end调整
objc_library与ios_unit_test配置
修改objc_library,直接包含C测试源文件,仅保留@googletest//:gtest依赖,并添加C编译选项。示例配置:objc_library( name = "objc_tests_lib", srcs = [ "objc_tests_lib/GoogleTests.mm", "cpp_tests_lib/cpp_test.cpp", ], deps = [ "@googletest//:gtest", ], visibility = ["//visibility:public"], sdk_frameworks = ["XCTest"], copts = ["-std=c++17"], ) ios_unit_test( name = "ios_objc_tests_lib", minimum_os_version = "17.0", deps = [":objc_tests_lib"], visibility = ["//visibility:public"], )验证链接过程
若测试仍未执行,可通过bazel build //:ios_objc_tests_lib --verbose_failures查看详细构建日志,确认cpp_test.cpp的目标文件是否被正确链接到测试包中。
内容的提问来源于stack exchange,提问作者Prasad

