九、Yocto创建SDK,给Makefile/CMake使用

2024-04-20 20:04

本文主要是介绍九、Yocto创建SDK,给Makefile/CMake使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Yocto创建SDK、Toolchain,给Makefile/CMake使用
    • 一、介绍
    • 二、创建Yocto sdk
    • 三、使用sdk 配合makefile编译应用程序
    • 四、使用sdk 配合cmake编译应用程序

Yocto创建SDK、Toolchain,给Makefile/CMake使用

本篇文章为基于raspberrypi 4B单板的yocto实战系列的第九篇文章:
一、yocto 编译raspberrypi 4B并启动
二、yocto 集成ros2(基于raspberrypi 4B)
三、Yocto创建自定义的layer和image
四、Yocto创建静态IP和VLAN
五、Yocto集成QT5
六、Yocto给组件分组(packagegroups)
七、Yocto使用systemd设置开机自启动程序
八、Yocto 创建自定义的conf文件

本章节介绍如何创建一个yocto sdk并且使用sdk来开发应用程序。

一、介绍

通常含有yocto编译环境的能够直接用来编译应用程序,比如之前我们编写的qt luncher demo程序,就是创建了一个bb文件集成到meta-rpi-robot文件夹下并最终编译到烧录image里面。但是有时候我们需要协同开发,并不能保证每个人都会有yocto源码环境,构建一个yocto环境会耗费数个小时,这时候其实我们可以通过yocto主机环境构建一个sdk给其他同学使用,这样其他同学并不需要yocto的主机环境也能完成交叉编译测试,大大提高了开发效率和协同性。
在这里插入图片描述
如上图所示,安装sdk以后的sdk machine可以交叉编译代码、调试代码、通过推送可执行的交叉编译产物进行功能验证,等验证结束以后在编写bb文件到yocto project machine上去做系统集成。

二、创建Yocto sdk

Yocto sdk分成两种:Standard SDK和Extensible SDK。
这两种sdk里面都具有如下组件:

  • 交叉编译工具链
  • 目标平台的运行环境包含头文件、动态库等内容,一般叫做sysroot
  • 环境初始化脚本
    他们之间的区别如下:
    在这里插入图片描述
    Extensible SDK基本包含了yocto主机环境的所有构建环境,能够使用devtool工具快捷操作,有和使用原生完整yocto构建环境的体验。但是也会导致sdk的环境过大,通常情况下如果只想用sdk来交叉编译程序那么使用Standard SDK基本就可以满足需求。

下面我们就来创建我们raspberrypi 4b配套的sdk:

source poky-kirkstone/oe-init-build-env  rpi-build
bitbake rpi-robot-image -c populate_sdk

在这里插入图片描述

这样我们就得到了sdk文件,是一个.sh的脚本文件,完整路径在tmp/deploy/sdk路径下面,执行这个脚本就会开始安装我们的sdk:
在这里插入图片描述
默认安装到/opt/poky/4.0.17文件夹下面:
在这里插入图片描述

三、使用sdk 配合makefile编译应用程序

上面安装了我们的sdk就可以利用sdk来交叉编译我们的应用程序了,因为makefile比较简单,这里我们简单做个示例,使用下面两个变量编译即可:

source /opt/poky/4.0.17/environment-setup-cortexa72-poky-linux
$CC -o main main.c
$CXX -o main main.cpp

四、使用sdk 配合cmake编译应用程序

本小节介绍如何在cmake工程中配合sdk来完成交叉编译
首先创建一个测试程序main.cpp

#include <iostream>int main(int argc, char** argv)
{std::cout << " hello yocto! " << std::endl;return 0;
}

然后创建一个CMakeLists.txt:

cmake_minimum_required (VERSION 3.5.1)
project(cmake-test CXX)add_executable(${PROJECT_NAME} main.cpp)

下面关键就是需要创建一个poky_toolchain.cmake文件

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)# specify the cross compiler
set(CMAKE_C_FLAGS " -mcpu=cortex-a72 -march=armv8-a+crc -mbranch-protection=standard -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/4.0.17/sysroots/cortexa72-poky-linux")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-a72 -march=armv8-a+crc -mbranch-protection=standard -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/4.0.17/sysroots/cortexa72-poky-linux")set(CMAKE_C_COMPILER   "aarch64-poky-linux-gcc")
set(CMAKE_CXX_COMPILER "aarch64-poky-linux-g++")# where is the target environment
set(CMAKE_SYSROOT $ENV{SDKTARGETSYSROOT})set(CMAKE_FIND_ROOT_PATH  $ENV{SDKTARGETSYSROOT})
# search for programs in the build host directories (not necessary)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

下面就是开始交叉编译:

source /opt/poky/4.0.17/environment-setup-cortexa72-poky-linux
mkdir build && cd build 
cmake -DCMAKE_TOOLCHAIN_FILE="poky_toolchain.cmake" ..
make

结果如下,可以看到我们的cmake-test程序确实是ARM架构的应用程序。
在这里插入图片描述

这篇关于九、Yocto创建SDK,给Makefile/CMake使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921197

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2