基于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 操作系统。配置参考如下:

image

 3.1 准备工具链和SDK

image

 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 验证

image

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
  • 查看编译结果

image

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
  • 查看编译结果

image

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
  • 查看结果

image

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

 

posted @ 2025-12-25 10:56  钟齐峰  阅读(21)  评论(0)    收藏  举报