轻松学习yocto:20-SDK

发布时间:2026/8/12 17:30:15
轻松学习yocto:20-SDK 第10课很好你现在已经完成了 Yocto 学习中最重要的一段✅ Layer✅ Recipe✅ do_install✅ Image✅ RDEPENDS✅ kernel menuconfig✅ Device Tree✅ Kernel Module✅ Platform Driver下一步确实应该进入 第10课SDK(Application Development)。这是 Yocto 从系统开发过渡到应用开发的关键一步。第10课SDK——掌握应用开发目标只有一句话摘要本文是 Yocto 学习系列的第10课重点讲解 SDKSoftware Development Kit在嵌入式应用开发中的核心作用。主要内容包括1) 为什么需要 SDK——为应用工程师提供交叉编译环境使其能在 x86 主机上编译 ARM 目标板程序2) SDK 的组成——包含 ARM GCC/G/GDB、pkg-config、sysroot 以及目标镜像中所有包的头文件和库3) SDK 与 RootFS 的关系——SDK 自动包含镜像中已安装软件包如 openssl、curl的开发文件4) 生成、安装和使用 SDK 的完整步骤5) 通过 hello.c 示例演示交叉编译、验证和部署到树莓派的流程6) 区分 SDK 开发与 Recipe 集成的不同场景7) 提供结合 Raspberry Pi 2 环境的实践建议。最后文章还详细说明了如何为 Ubuntu 虚拟机配置双网卡NAT 桥接以实现主机与目标板的稳定网络连接完成应用部署与调试。不用整个 Yocto 编译也能给目标板开发程序。这就是 SDKSoftware Development Kit的意义。一、为什么需要 SDK假设以后有一个应用工程师。他只负责写main.c例如#includestdio.hintmain(void){printf(Hello Raspberry Pi!\n);return0;}他根本不想- bitbake - menuconfig - image - recipe - rootfs他只想 : gcc main.c但是, 他的电脑是 x86树莓派是 ARM普通 gcc 编出来的是 : ELF x86树莓派不能运行。所以需要 : ARM GCC例如 : arm-poky-linux-gnueabi-gccSDK 就提供这一整套交叉开发环境。二、SDK里面有什么安装 SDK 后你会得到ARM GCC ARM G ARM GDB pkg-config sysroot 头文件 库文件例如stdio.h pthread.h libpthread.so libm.so libc.so还有你的 Image 里面所有 package 的头文件例如opencv qt boost openssl如果 Image 有IMAGE_INSTALLopensslSDK 就有openssl headers三、SDK 与 RootFS 的关系假设你的 imagemyproduct-image里面有hello-driver openssl sqlitecurl生成 SDK 时bitbake myproduct-image-cpopulate_sdkSDK 自动知道我的 RootFS 有哪些库。于是SDK 里面也有curlheaders sqlite headers openssl headers所以应用程序#include curl/curl.h可以直接编译。四、生成 SDK最重要命令bitbake myproduct-image -c populate_sdklike build image, take a long time100GB space is not enough for adding sdk. expand to 150GBbitbake myproduct-image -c populate_sdkall succeeded.编译结束以后tmp/deploy/sdk/里面会出现tmp/deploy/sdk/poky-glibc-x86_64-myproduct-image-cortexa7t2hf-neon-vfpv4-raspberrypi2-toolchain-5.0.19.sh五、安装 SDK例如./tmp/deploy/sdk/poky-glibc-x86_64-myproduct-image-cortexa7t2hf-neon-vfpv4-raspberrypi2-toolchain-5.0.19.shEnter target directory for SDK (default: /opt/poky/5.0.19):里面就是完整 SDK。六、进入 SDK 环境每次开发前执行:source/opt/poky/5.0.19/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi cxiccyocto:~/yocto/build-rpi2$echo$CCarm-poky-linux-gnueabi-gcc-mthumb-mfpuneon-vfpv4 -mfloat-abihard-mcpucortex-a7 -fstack-protector-strong-O2-D_FORTIFY_SOURCE2-Wformat-Wformat-security-Werrorformat-security-D_TIME_BITS64-D_FILE_OFFSET_BITS64--sysroot/opt/poky/5.0.19/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi cxiccyocto:~/yocto/build-rpi2$echo$SDKTARGETSYSROOT/opt/poky/5.0.19/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi cxiccyocto:~/yocto/build-rpi2$which${CC%%*}/opt/poky/5.0.19/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc七、编译第一个程序例如 : hello.c#includestdio.hintmain(void){printf(Hello SDK!\n);return0;}编译$CC hello.c -o hello不用写 : arm-poky-linux-gnueabi-gcc因为 CC 已经设置好了。八、验证程序查看 : file hello应该看到ELF32-bit LSB executable ARM EABI5不是 : x86-64说明交叉编译成功。九、拷到树莓派运行例如: scp hello root169.254.125.50:/root树莓派chmodx hello ./hello输出Hello SDK!整个流程完成。十、SDK 与 Recipe 的区别很多初学者会混淆两种开发方式通常开发流程是1.用 SDK 快速编写和调试应用。2.应用稳定后编写对应的 Recipe如 myapp.bb。3.将 Recipe 加入 IMAGE_INSTALL通过 BitBake 构建最终产品镜像。十一、建议的学习实验结合你当前已经搭建好的 Raspberry Pi 2 myproduct-image 环境我建议按下面顺序完成1.使用 bitbake myproduct-image-cpopulate_sdk 生成 SDK。2.安装 SDK并source环境脚本。3.编写一个 hello.c使用$CC编译。4.用filehello 验证生成的是 ARM 可执行文件。5.将程序复制到树莓派运行。6.再编写一个使用 pthread 或 math 库的小程序练习链接系统库。7.最后把这个程序制作成一个新的 Recipe加入 myproduct-image对比 SDK 开发 与 Yocto 集成开发 的完整流程。完成这一课后你就打通了 Yocto 的两条核心开发路线- 系统开发路线Layer → Recipe → Image → Kernel → Device Tree → Driver - 应用开发路线SDK → 交叉编译 → 调试 → Recipe 集成这也是许多企业中 BSP 工程师与应用工程师协作时最常见的工作模式。Ubuntu VM 配置 两块虚拟网卡建议给 Ubuntu VM 配置 两块虚拟网卡。怎么做这是企业里最常见的 Yocto 开发环境配置。我一步一步带你配置。当前目标配置 Ubuntu VMAdapter1NAT 上网 Adapter2Bridged Adapter 连接 Raspberry Pi最终效果第一步关闭 Ubuntu VM不要保存状态Save State而是Shutdown或者 Power Off第二步打开 VirtualBox 设置选择你的 Ubuntu 虚拟机Settings Network第三步修改 Adapter 1目前 Adapter 1 是Bridged Adapter Intel Wi-Fi改成Adapter1✓ Enable Network Adapter Attached to: NAT其它保持默认即可。第四步启用 Adapter 2点击Adapter2勾选✓ Enable Network Adapter设置Attached to: Bridged Adapter然后Name:这里不要选 Intel Wi-Fi。请选择Ethernet也就是 Windows ipconfig 中这一块Ethernet adapter Ethernet IPv4 Address169.254.125.127如果下拉框显示的是Realtek PCIe GbE Family Controller或者Intel Ethernet Connection或者USB Ethernet Adapter总之选择与你 Raspberry Pi 相连的那块有线网卡。第五步启动 Ubuntu启动 VM。执行ipaddr应该能看到enp0s3 inet10.0.2.15还有一块enp0s8如果 DHCP 没有地址也没关系。第六步给第二块网卡配置 Link-Local 地址因为 Raspberry Pi 是169.254.125.50Ubuntu 可以直接配置sudoipaddradd169.254.125.126/16 dev enp0s8sudoiplinksetenp0s8 up然后ping169.254.125.50应该就能通。第七步 网卡2设固定IP方法一推荐Netplan永久生效假设你的文件是/etc/netplan/01-network-manager-all.yaml编辑sudonano/etc/netplan/01-network-manager-all.yaml例如改成network: version:2renderer: NetworkManager ethernets: enp0s3: dhcp4:trueenp0s8: dhcp4:falseaddresses: -169.254.125.126/16保存后执行sudonetplan apply然后验证ipaddr show enp0s8应该自动出现inet169.254.125.126/16以后每次启动都会有。第八步SSH然后sshroot169.254.125.50成功以后scphello root169.254.125.50:/home/root就可以了。# ./helloHello SDK!