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

无法通过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中不执行的关键步骤:

  1. 移除gtest_main依赖
    gtest_main会提供独立的main函数,与iOS单元测试由XCTest框架管理入口的逻辑冲突。需删除所有@googletest//:gtest_main依赖,改用GoogleTests.mm中的逻辑触发GTest运行。

  2. 确保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
    
  3. 调整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"],
    )
    
  4. 验证链接过程
    若测试仍未执行,可通过bazel build //:ios_objc_tests_lib --verbose_failures查看详细构建日志,确认cpp_test.cpp的目标文件是否被正确链接到测试包中。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:13:18