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

如何在OpenWrt中为x32设备添加GMOCK/GTEST测试(非设备编译)

我来帮你理清这个问题——完全不需要在目标设备内编译,OpenWrt的交叉编译生态就是专门解决这类跨架构开发需求的。下面给你两种可行的方案,从规范复用的长期方案到快速集成的临时方案都有:

方案1:将GTest/GMock打包为独立的OpenWrt软件包

这是最规范的方式,适合后续多个项目复用,也符合OpenWrt的软件包管理逻辑。

  • 第一步:创建软件包目录
    在OpenWrt源码的package/feeds/packages下(或者你自己的自定义feed目录),分别新建gtest和gmock两个目录(GMock依赖GTest,所以需要分开或合并处理)。

  • 第二步:编写软件包Makefile
    以GTest为例,在gtest目录下创建Makefile,内容如下(记得替换哈希值为对应版本的实际值):

    include $(TOPDIR)/rules.mk
    
    PKG_NAME:=gtest
    PKG_VERSION:=1.14.0
    PKG_RELEASE:=1
    
    PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
    PKG_SOURCE_URL:=https://github.com/google/googletest/archive/refs/tags/v$(PKG_VERSION).tar.gz
    PKG_HASH:=8ad598c73ad796e0d8280b082cebd82a630d73e73cd3c70057938a6501bba5d7
    
    PKG_BUILD_DIR:=$(BUILD_DIR)/googletest-$(PKG_VERSION)/googletest
    
    include $(INCLUDE_DIR)/package.mk
    include $(INCLUDE_DIR)/cmake.mk
    
    define Package/gtest
      SECTION:=libs
      CATEGORY:=Libraries
      TITLE:=Google Test Framework
      URL:=https://github.com/google/googletest
    endef
    
    define Package/gtest/description
      Google's framework for writing C++ tests.
    endef
    
    define Build/InstallDev
      $(INSTALL_DIR) $(1)/usr/include
      $(CP) $(PKG_BUILD_DIR)/include/gtest $(1)/usr/include/
      $(INSTALL_DIR) $(1)/usr/lib
      $(CP) $(PKG_BUILD_DIR)/lib/libgtest*.a $(1)/usr/lib/
    endef
    
    $(eval $(call BuildPackage,gtest))
    

    GMock的Makefile逻辑类似,只需调整PKG_BUILD_DIR为$(BUILD_DIR)/googletest-$(PKG_VERSION)/gmock,并在Package/gmock中添加DEPENDS:=+gtest依赖。

  • 第三步:交叉编译并安装
    在OpenWrt源码根目录执行:

    # 编译GTest
    make package/gtest/compile V=s
    # 编译GMock
    make package/gmock/compile V=s
    

    编译完成后,会在bin/x32/packages/目录下生成对应的.ipk安装包,通过scp传到x32设备后,用opkg install命令安装即可。之后你的项目软件包可以直接在Makefile中添加DEPENDS:=+gtest +gmock来依赖它们。

方案2:将GTest/GMock直接集成到你的项目软件包

如果只是单个项目使用,不想单独维护独立软件包,可以把GTest/GMock源码嵌入到自己的项目构建流程中:

  • 第一步:将GTest/GMock源码放入项目软件包的src目录,或者用Git子模块引入。
  • 第二步:修改项目软件包的Makefile,添加交叉编译GTest/GMock的步骤:
    include $(TOPDIR)/rules.mk
    
    # ... 你的项目原有定义 ...
    
    define Build/Prepare
      $(call Build/Prepare/Default)
      # 将GMock(包含GTest)复制到构建目录
      $(CP) ./src/gmock $(PKG_BUILD_DIR)/
    endef
    
    define Build/Compile
      # 先交叉编译GTest/GMock
      $(CMAKE) -S $(PKG_BUILD_DIR)/gmock -B $(PKG_BUILD_DIR)/gmock/build \
        -DCMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) \
        -DBUILD_SHARED_LIBS=OFF \
        -DGTEST_BUILD_TESTS=OFF
      $(MAKE) -C $(PKG_BUILD_DIR)/gmock/build
    
      # 再编译你的测试程序,链接GTest/GMock库
      $(CMAKE) -S $(PKG_BUILD_DIR) -B $(PKG_BUILD_DIR)/build \
        -DCMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) \
        -DGTEST_INCLUDE_DIR=$(PKG_BUILD_DIR)/gmock/gtest/include \
        -DGTEST_LIBRARY=$(PKG_BUILD_DIR)/gmock/build/lib/libgtest.a \
        -DGMOCK_INCLUDE_DIR=$(PKG_BUILD_DIR)/gmock/include \
        -DGMOCK_LIBRARY=$(PKG_BUILD_DIR)/gmock/build/lib/libgmock.a
      $(MAKE) -C $(PKG_BUILD_DIR)/build
    endef
    
    # ... 你的项目其他定义 ...
    
    $(eval $(call BuildPackage,your-project))
    
    这样编译你的项目时,会自动用OpenWrt的交叉工具链编译GTest/GMock,最终生成能在x32设备上运行的测试程序。
为什么手动复制头文件没用?

你之前尝试手动复制头文件失败的核心原因是:GTest/GMock不仅需要头文件,还需要对应的预编译库文件,而主机x86_64编译的库无法在x32架构设备上运行——必须用OpenWrt提供的交叉编译工具链生成针对目标架构的库才行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:34:20