栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

CSerialPort教程(7) - 交叉编译和qemu模拟运行CSerialPort

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CSerialPort教程(7) - 交叉编译和qemu模拟运行CSerialPort

CSerialPort教程(7) - 交叉编译和qemu模拟运行CSerialPort

如需转载请标明出处: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
1. 搭建交叉编译环境 1.1 使用riscv提供的riscv-gnu-toolchain交叉编译器
$ 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-gcc
1.2 使用Ubuntu源的riscv交叉编译器
$ sudo apt-get install g++-riscv64-linux-gnu
2. 获取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 stripped
3.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 stripped
4. 运行交叉编译的CSerialPort程序 4.1 安装qemu-user

我们使用qemu-riscv64模拟运行riscv的CSerialPortDemoNoGui。

$ sudo apt-get install qemu-user
4.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 directory
4.1 运行静态方式的交叉编译程序
$ qemu-riscv64 bin/CSerialPortDemoNoGui
5. 其他架构交叉编译器 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-gnuabi64
5.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:

  1. https://github.com/itas109/CSerialPort
  2. https://gitee.com/itas109/CSerialPort
  3. https://blog.csdn.net/itas109
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868323.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号