如何在OpenWrt中为x32设备添加GMOCK/GTEST测试(非设备编译)
我来帮你理清这个问题——完全不需要在目标设备内编译,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来依赖它们。
如果只是单个项目使用,不想单独维护独立软件包,可以把GTest/GMock源码嵌入到自己的项目构建流程中:
- 第一步:将GTest/GMock源码放入项目软件包的
src目录,或者用Git子模块引入。 - 第二步:修改项目软件包的Makefile,添加交叉编译GTest/GMock的步骤:
这样编译你的项目时,会自动用OpenWrt的交叉工具链编译GTest/GMock,最终生成能在x32设备上运行的测试程序。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))
你之前尝试手动复制头文件失败的核心原因是:GTest/GMock不仅需要头文件,还需要对应的预编译库文件,而主机x86_64编译的库无法在x32架构设备上运行——必须用OpenWrt提供的交叉编译工具链生成针对目标架构的库才行。
内容的提问来源于stack exchange,提问作者g_d

