基于OpenWRT开发路由器嵌入式应用程序
基于OpenWRT开发路由器嵌入式应用程序
1 环境:
OS :debian 12
交叉编译工具链:
- OpenWrt-Toolchain-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64.tar.bz2
- OpenWrt-SDK-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64.tar.bz2
下载路径:
https://pan.baidu.com/s/1pLtXH85c0MoJtllFwfhVhw?pwd=va1p
2 OpenWrt简介
OpenWrt是一个嵌入式Linux发行版本,主要应用于路由器等嵌入式设备。其采用可写文件系统架构,通过包管理系统实现模块化扩展,开发者无需重新编译固件即可定制功能,支持跨平台及多种处理器架构。其高度模块化、高度自动化,拥有强大的网络组件和扩展性,常常被用于工控设备、电话机、小型机器人、智能家居、路由器以及VOIP设备。同时,还提供了100多个已编译好的软件,而且数据还在不断增加,而OpenWrt SDK更加简化了开发软件的工序。
官网地址:
https://openwrt.org/
3 准备开发环境
准备好Debian 12 操作系统。配置参考如下:

3.1 准备工具链和SDK

3.2 部署工具链和SDK
tar -jxvf ./OpenWrt-Toolchain-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64.tar.bz2 tar -jxvf ./OpenWrt-SDK-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64.tar.bz2
3.3 添加环境变量
export PATH=$PATH:/opt/openwrt/OpenWrt-Toolchain-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64/toolchain-aarch64_cortex-a53_gcc-5.2.0_musl-1.1.16/bin export STAGING_DIR=/opt/openwrt/OpenWrt-SDK-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64/staging_dir
3.4 验证

4 交叉编译示例
4.1 直接编译C源码
- 进入到编译目录
cd /opt/openwrt/OpenWrt-SDK-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64/package mkdir -p Helloworld cd Helloworld mkdir -p src
- 编写main.c程序
#include <stdio.h> int main() { printf("Hello OpenWrt!\n"); return 0; }
-
编译
aarch64-openwrt-linux-musl-gcc main.c -o HelloWorld
- 查看编译结果

4.2 使用cmake编译C++
- 创建aarch64-openwrt-toolchain.cmake文件:
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_C_COMPILER aarch64-openwrt-linux-musl-gcc) set(CMAKE_CXX_COMPILER aarch64-openwrt-linux-musl-g++) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(PLATFORM_OPENWRT TRUE) #设置平台标签
- 创建CMakeLists.txt:
cmake_minimum_required(VERSION 3.20) project(HelloWorld LANGUAGES CXX) if(PLATFORM_OPENWRT) #跟前平台区分不同版本编译器 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(hello main.cpp) endif()
- 编写main.cpp:
#include <iostream> #include <thread> #include <chrono> int main() { std::cout<<"Hello World"<<std::endl; return 0; }
- 编译
mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../aarch64-openwrt-toolchain.cmake make
- 查看编译结果

5 编译boost OpenWrt静态库
5.1 编译Openwrt静态库
下载代码:
wget https://archives.boost.io/release/1.88.0/source/boost_1_88_0.tar.gz tar -xzvf boost_1_88_0.tar.gz cd boost_1_88_0
执行配置
./bootstrap.sh
配置boost编译器(user-config.jam),在Boost源码目录下新建user-config.jam:
# 文件路径:Boost源码根目录/user-config.jam # 使用 OpenWrt aarch64 工具链 using gcc : openwrt : /opt/openwrt/OpenWrt-Toolchain-ipq-ipq60xx_64_gcc-5.2.0_musl-1.1.16.Linux-x86_64/toolchain-aarch64_cortex-a53_gcc-5.2.0_musl-1.1.16/bin/aarch64-openwrt-linux-g++ ;
-
gcc→ 工具集 -
openwrt→ 标签名,后续 b2 用toolset=gcc-openwrt -
路径 → 指向 交叉编译器 g++ 可执行文件
编译Boost静态库
# 编译 aarch64 OpenWrt 静态库,只编译常用库 ./b2 \ --user-config=./user-config.jam \ toolset=gcc-openwrt \ target-os=linux \ threading=multi \ link=static \ runtime-link=static \ variant=release \ cxxflags="-std=c++17 -O2 -pipe -march=armv8-a -mcpu=cortex-a53" \ --with-system \ --with-filesystem \ --with-thread \ --with-chrono \ --with-date_time \ --with-regex \ --with-atomic \ --prefix=/opt/boost-openwrt \ install
5.2 引用boost Openwrt静态库
- 修改CMakeLists.txt文件,添加头文件和库文件路径,链接静态库libboost_filesystem.a
cmake_minimum_required(VERSION 3.20) project(HelloWorld LANGUAGES CXX) if(PLATFORM_OPENWRT) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) include_directories(${PROJECT_SOURCE_DIR} /opt/boost-openwrt/include ) link_directories(${PROJECT_SOURCE_DIR} /opt/boost-openwrt/lib ) add_executable(HelloWorld main.cpp) target_link_libraries(${PROJECT_NAME} boost_filesystem ) endif()
- 修改main.cpp
#include <iostream> #include <boost/asio.hpp> #include <boost/filesystem.hpp> int main() { // ===== Boost.Asio 示例 ===== boost::asio::io_context io; boost::asio::steady_timer timer(io, std::chrono::seconds(1)); timer.async_wait([](const boost::system::error_code& ec) { if (!ec) { std::cout << "Boost.Asio timer fired!" << std::endl; } }); io.run(); // ===== Boost.Filesystem 示例 ===== boost::filesystem::path p("/tmp"); if (boost::filesystem::exists(p)) { std::cout << p << " exists" << std::endl; } else { std::cout << p << " does not exist" << std::endl; } std::cout << "Current path: " << boost::filesystem::current_path() << std::endl; return 0; }
- 编译
make
- 查看结果

7 编译zlib静态库
- 编译zlib静态库
下载zlib源码
git clone https://github.com/madler/zlib.git
设置编译环境
export CC=aarch64-openwrt-linux-musl-gcc export AR=aarch64-openwrt-linux-musl-ar export RANLIB=aarch64-openwrt-linux-musl-ranlib
编译
cd zlib-develop ./configure --static --prefix=/opt/openwrt-lib/zlib make make install
- 编译minizip静态库
进入到contrib/minizip目录:
aarch64-openwrt-linux-musl-gcc \ -c ioapi.c unzip.c zip.c \ -I/opt/openwrt-lib/zlib/include \ -I../../ aarch64-openwrt-linux-musl-ar rcs libminizip.a *.o
8 编译PCRE2库
下载源码
wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.gz tar xf pcre2-10.42.tar.gz cd pcre2-10.42
编译
# 设置交叉编译环境 export CC=aarch64-openwrt-linux-musl-gcc export CXX=aarch64-openwrt-linux-musl-g++ export AR=aarch64-openwrt-linux-musl-ar export RANLIB=aarch64-openwrt-linux-musl-ranlib # 配置编译选项 ./configure --host=aarch64-openwrt-linux \ --prefix=/opt/openwrt-lib/pcre2 \ --enable-static \ --disable-shared # 编译和安装 make make install
9 编译poco静态库
下载poco源码(不用最新版本,本交叉工具链不支持)
wget https://github.com/pocoproject/poco/archive/refs/tags/poco-1.9.4-release.tar.gz tar -xvf poco-1.14.0-release.tar.gz cd poco-1.14.0-release
创建aarch64-openwrt-toolchain.cmake文件
# aarch64-openwrt-toolchain.cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) # 指定交叉编译器 set(CMAKE_C_COMPILER aarch64-openwrt-linux-musl-gcc) set(CMAKE_CXX_COMPILER aarch64-openwrt-linux-musl-g++) # 静态库专用设置 set(BUILD_SHARED_LIBS OFF) # 禁用共享库 set(POCO_STATIC ON) # 强制使用静态库 # 查找策略 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
编译
cmake /opt/poco-poco-1.9.4-release \ -DCMAKE_TOOLCHAIN_FILE=../aarch64-openwrt-toolchain.cmake \ -DCMAKE_INSTALL_PREFIX=/opt/openwrt-lib/poco_1.9.4 \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ # ← 禁用共享库,生成静态库 -DPOCO_STATIC=ON \ # ← Poco 静态库标志 -DENABLE_XML=ON \ -DENABLE_JSON=ON \ -DENABLE_CPPPARSER=ON \ -DENABLE_PAGECOMPILER=ON \ -DENABLE_ACTIVERECORD=ON \ -DENABLE_UTIL=ON \ -DENABLE_FOUNDATION=ON make make install
10 编译gRPC静态库
10.1 安装vcpkg工具
cd ~ git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh
10.2 自定义triplet
cd triplets
vim x64-openwrt.cmake
输入内容
set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER aarch64-openwrt-linux-musl-gcc) set(CMAKE_CXX_COMPILER aarch64-openwrt-linux-musl-g++) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
10.3 编译
./vcpkg install grpc:x64-openwrt
浙公网安备 33010602011771号