Google C++ unit test 在ARM Android 2.3 上的编译与使用

本文详细描述了如何在ARM Android 2.3环境下编译并使用Google C++ unittest工具进行单元测试。包括下载、配置编译器、更新配置文件、编译gtest库以及在项目中使用gtest进行测试的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Google C++ unit test 是一款很不错的单元测试工具,易于构建单元测试例。我们在项目中也使用了此款工具,本文主要描述如何在ARMAndroid 2.3 环境下编译及使用googleC++ unit test 工具。本文假设读者已具备googleC++ unit test相应的基本知识。 如需了解基本知识,请参阅http://code.google.com/p/googletest/

1. 编译

我们项目所用的编译器:arm-linux-androideabi-g++及其相应工具链

http://code.google.com/p/googletest/downloads/detail?name=gtest-1.6.0.zip处获取gtest-1.6.0.zip

a) 下载解压后,需更新build-aux目录下的 config.sub 。此为必须,否则将不能识别arm-linux-androideabi工具链。Config.sub可从http://gcc.gnu.org/svn/gcc/branches/cilkplus/config.sub 获取。

b) 然后执行./configure –host= arm-linux-androideabi

c) 此后会生成Makefile 文件, 接着我们需要编辑Makefile文件, 改动CXXFLAGS为 CXXFLAGS = -g -O2 –DANDROID 。 此为必须,否则编译不能通过。

d) 最后执行make , 在lib/.lib/目录下生成了libgtest.a文件。

2. 使用

假设项目只有两个文件: a.cpp;main.cpp 。

a) a.cpp 为主要被测文件,为此我们创建了一个测试文件,其中包含对a.cpp的测试例,命名为a_unittest.cpp。

b) 修改main函数为如下:

Int main(int argc, char *argv[])

{

testing::InitGoogleTest(&argc,argv);

returnRUN_ALL_TESTS();

}

c) 修改被测项目的Makefile ,一使其包含gtest的include目录。二使其在link时,需加上libgtest.a文件,即最终可执行文件应为如下link而成: a.o + main.o + a_unittest.o+ libgtest.a

运行此可执行文件即为运行单元测试例

<think>嗯,用户想在OpenWRT的ARM平台上编译ONNX Runtime,这听起来有点挑战性。首先,我得确认OpenWRT的环境是否支持构建这样的库。OpenWRT主要是针对嵌入式设备的,资源可能有限,所以需要考虑交叉编译的问题。 首先,用户需要安装OpenWRT的SDK或者自己编译固件,这样才能获得交叉编译工具链。这一步是关键,因为ONNX Runtime需要针对ARM架构进行编译,而开发机可能是x86的。然后,要确保工具链的路径正确,这样才能调用正确的编译器。 接下来,下载ONNX Runtime的源代码是必须的。用户可能需要选择较新的版本,同时注意是否有特定commit或分支对ARM平台支持更好。然后,配置CMake参数时,需要指定交叉编译选项,比如CMAKE_SYSTEM_NAME、CMAKE_C_COMPILER和CMAKE_CXX_COMPILER。这一步可能会遇到问题,比如工具链文件是否正确,或者是否有缺失的依赖项。 然后,禁用不需要的组件可以减小最终生成的库的大小,比如JavaScript支持或GPU加速,这在嵌入式设备上可能用不到。但需要注意,有些依赖项可能需要手动处理,比如Protobuf,如果系统没有预装,可能需要自己编译并指定路径。 编译过程中可能会遇到各种错误,比如缺少依赖库或者编译器不支持某些特性。这时候需要根据错误信息逐一排查,可能需要安装额外的软件包或者调整编译选项。例如,OpenWRT的libstdc++版本可能较低,导致C++17特性无法使用,这时候需要确认工具链是否支持,或者ONNX Runtime是否有兼容旧版本的选项。 最后,编译完成后,将生成的库和头文件部署到OpenWRT设备上,并进行测试。如果运行时出现链接错误,可能需要检查动态库的路径是否正确,或者是否有未满足的依赖关系。可能需要使用ldd或者readelf工具来查看依赖情况。 整个过程中,用户需要有耐心,逐步解决每个问题,同时参考ONNX Runtime和OpenWRT的官方文档,确保每一步都正确无误。此外,考虑到嵌入式设备的资源限制,可能还需要优化生成的库,比如减少体积或启用必要的优化选项。</think>在OpenWRT ARM平台编译ONNX Runtime需要处理交叉编译、依赖管理和资源限制等问题。以下是分步骤指南: --- ### **1. 准备编译环境** - **安装OpenWRT SDK** ```bash # 下载对应版本的SDK(例如openwrt-sdk-21.02.0-arm_cortex-a9_neon.Linux-x86_64.tar.xz) tar -xvf openwrt-sdk-*.tar.xz cd openwrt-sdk-* ``` - **配置工具链路径** ```bash export STAGING_DIR=$(pwd)/staging_dir export PATH=$PATH:$(pwd)/staging_dir/toolchain-arm_cortex-a9+neon_gcc-8.4.0_musl_eabi/bin ``` --- ### **2. 获取ONNX Runtime源码** ```bash git clone --recursive https://github.com/microsoft/onnxruntime cd onnxruntime git checkout v1.15.1 # 选择稳定版本 ``` --- ### **3. 配置CMake交叉编译参数** ```bash mkdir build-arm && cd build-arm cmake .. \ -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_SYSTEM_PROCESSOR=arm \ -DCMAKE_C_COMPILER=arm-openwrt-linux-gcc \ -DCMAKE_CXX_COMPILER=arm-openwrt-linux-g++ \ -DCMAKE_C_FLAGS="-march=armv7-a -mfpu=neon" \ -DCMAKE_CXX_FLAGS="-march=armv7-a -mfpu=neon" \ -DONNX_CUSTOM_PROTOC_EXECUTABLE=/path/to/protoc # 若需手动指定protobuf编译器 ``` --- ### **4. 关键依赖处理** - **禁用非必要组件** ```bash -Donnxruntime_BUILD_UNIT_TESTS=OFF \ -Donnxruntime_ENABLE_PYTHON=OFF \ -Donnxruntime_BUILD_SHARED_LIB=ON \ -Donnxruntime_USE_CUDA=OFF \ -Donnxruntime_USE_DNNL=OFF ``` - **解决常见依赖冲突** - 若出现`libprotobuf`错误,需手动编译protobuf并指定路径: ```bash -DProtobuf_LIBRARIES=/path/to/protobuf/lib \ -DProtobuf_INCLUDE_DIR=/path/to/protobuf/include ``` --- ### **5. 执行编译** ```bash make -j$(nproc) ``` 编译产物位于`build-arm/libonnxruntime.so.*` --- ### **6. 部署到OpenWRT设备** - 将以下文件通过scp传输到设备: ``` libonnxruntime.so include/onnxruntime/core/session/onnxruntime_c_api.h ``` - 在设备上设置动态库路径: ```bash export LD_LIBRARY_PATH=/path/to/onnxruntime/libs:$LD_LIBRARY_PATH ``` --- ### **常见问题解决** 1. **编译时内存不足** 添加swap分区或限制并行编译线程:`make -j2` 2. **未找到C++17支持** 在CMake中显式指定标准: ```bash -DCMAKE_CXX_STANDARD=17 \ -DCMAKE_CXX_STANDARD_REQUIRED=ON ``` 3. **符号链接错误** 使用`patchelf`修复动态库依赖: ```bash patchelf --set-rpath &#39;$ORIGIN&#39; libonnxruntime.so ``` --- ### **验证运行** ```bash # 编写测试程序(示例:test_onnx.c) #include <onnxruntime/core/session/onnxruntime_c_api.h> int main() { OrtApiBase* api = OrtGetApiBase(); printf("ONNX Runtime version: %s\n", api->GetVersionString()); return 0; } # 交叉编译测试程序 arm-openwrt-linux-gcc test_onnx.c -lonnxruntime -o test_onnx ``` --- 通过以上步骤,可在资源受限的OpenWRT ARM设备上运行ONNX Runtime。建议优先使用v1.8+版本,其对ARM架构的支持更完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值