如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
- CSerialPort教程(7) - 交叉编译和qemu模拟运行CSerialPort
- 前言
- 1. 搭建交叉编译环境
- 1.1 使用riscv提供的riscv-gnu-toolchain交叉编译器
- 1.2 使用Ubuntu源的riscv交叉编译器
- 2. 获取CSerialPort源码
- 3. 交叉编译
- 3.1 编写交叉编译的cmake文件
- 3.1 交叉编译CSerialPort(动态方式)
- 3.2 交叉编译CSerialPort(静态方式)
- 4. 运行交叉编译的CSerialPort程序
- 4.1 安装qemu-user
- 4.1 运行动态库方式的交叉编译程序
- 4.1 运行静态方式的交叉编译程序
- 5. 其他架构交叉编译器
- 5.1 Ubuntu源
- 5.2 Linaro交叉编译器
环境:
系统:Ubuntu 20.04 cmake: 3.22.1前言
CSerialPort项目是基于C++的轻量级开源跨平台串口类库,用于实现跨平台多操作系统的串口读写。
CSerialPort项目的开源协议自 V3.0.0.171216 版本后采用GNU Lesser General Public License v3.0
为了让开发者更好的使用CSerialPort进行开发,特编写基于4.x版本的CSerialPort教程系列。
本文将介绍如何在linux下交叉编译和qemu模拟运行CSerialPort的riscv程序。
CSerialPort项目地址:
- https://github.com/itas109/CSerialPort
- https://gitee.com/itas109/CSerialPort
$ wget https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2022.04.23/riscv64-glibc-ubuntu-20.04-nightly-2022.04.23-nightly.tar.gz $ sudo tar zxvf riscv64-glibc-ubuntu-20.04-nightly-2022.04.23-nightly.tar.gz -C /opt $ sudo ln -s /opt/riscv/bin/riscv64-unknown-linux-gnu-g++ /usr/bin/riscv64-linux-gnu-g++ $ sudo ln -s /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc /usr/bin/riscv64-linux-gnu-gcc1.2 使用Ubuntu源的riscv交叉编译器
$ sudo apt-get install g++-riscv64-linux-gnu2. 获取CSerialPort源码
$ git clone https://github.com/itas109/CSerialPort
国内开发者建议使用 https://gitee.com/itas109/CSerialPort
3. 交叉编译 3.1 编写交叉编译的cmake文件CSerialPort/cmake/toolchain_riscv64.cmake
# 交叉编译的系统名称 set(CMAKE_SYSTEM_NAME Linux) # 交叉编译的CPU架构 set(CMAKE_SYSTEM_PROCESSOR riscv64) #指明C和C++编译器 set(CMAKE_C_COMPILER /usr/bin/riscv64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/riscv64-linux-gnu-g++) #对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER 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)3.1 交叉编译CSerialPort(动态方式)
其中 CSerialPort/examples/CommNoGui为测试程序
$ cd CSerialPort $ mkdir bin_riscv64 && cd bin_riscv64 $ cmake .. -DCMAKE_TOOLCHAIN_FILE=./cmake/toolchain_riscv64.cmake $ cmake --build . $ file bin/CSerialPortDemoNoGui bin/CSerialPortDemoNoGui: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped3.2 交叉编译CSerialPort(静态方式)
静态方式用qemu运行时不需要指定交叉编译所需的libc.so等依赖文件,但程序体积会比较大。
静态方式编译CSerialPortDemoNoGui,需要修改examples/CommNoGui/CMakeLists.txt增加set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
cmake_minimum_required(VERSION 2.8.12)
project(CSerialPortDemoNoGui)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
...
编译命令
$ cd CSerialPort $ mkdir bin_riscv64 && cd bin_riscv64 $ cmake .. -DCMAKE_TOOLCHAIN_FILE=./cmake/toolchain_riscv64.cmake $ cmake --build . $ file bin/CSerialPortDemoNoGui bin/CSerialPortDemoNoGui: ELF 64-bit LSB executable, UCB RISC-V, version 1 (GNU/Linux), statically linked, for GNU/Linux 4.15.0, with debug_info, not stripped4. 运行交叉编译的CSerialPort程序 4.1 安装qemu-user
我们使用qemu-riscv64模拟运行riscv的CSerialPortDemoNoGui。
$ sudo apt-get install qemu-user4.1 运行动态库方式的交叉编译程序
- riscv-gnu-toolchain
$ qemu-riscv64 -L /opt/riscv/sysroot bin/CSerialPortDemoNoGui
- ubuntu源riscv
qemu-arm -L riscv64-linux-gnu bin/CSerialPortDemoNoGui
如果不指定库路径会报如下错误:
/lib/ld-linux-riscv64-lp64d.so.1: No such file or directory4.1 运行静态方式的交叉编译程序
$ qemu-riscv64 bin/CSerialPortDemoNoGui5. 其他架构交叉编译器 5.1 Ubuntu源
- arm
sudo apt-get install g++-arm-linux-gnueabi
- aarch64
sudo apt-get install g++-aarch64-linux-gnu
- mips64el
sudo apt-get install g++-mips64el-linux-gnuabi645.2 Linaro交叉编译器
https://releases.linaro.org/components/toolchain/binaries/
- arm
$ wget https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz $ wget https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/sysroot-linaro-eglibc-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz
- aarch64
$ wget https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/aarch64-linux-gnu/gcc-linaro-4.9-2016.02-x86_64_aarch64-linux-gnu.tar.xz $ wget https://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/aarch64-linux-gnu/sysroot-linaro-eglibc-gcc4.9-2016.02-aarch64-linux-gnu.tar.xz
License
License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
Reference:
- https://github.com/itas109/CSerialPort
- https://gitee.com/itas109/CSerialPort
- https://blog.csdn.net/itas109



