Yocto下如何安装交叉编译工具生成SDK包,并使用SDK

本文介绍如何在Yocto项目中构建交叉编译工具链,并提供了两种生成方法:一种仅适用于编译bootloader和内核,另一种可用于更广泛的软件开发,如QT程序开发等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、先进入Yocto的BSP包的根目录下,输入如下命令:

xxx@xxx-virtual-machine:~/BSP-Yocto-AM335x-PD17.1.1$ . sources/poky/oe-init-build-env

2、有两种方法来生成交叉编译工具链:

a、bitbake meta-toolchain 

此命令生成的交叉编译工具链只适用于编译bootlaoder和内核,不包含外部库。

b、bitbake -c populate_sdk [image名称]

其中image名称一般是 

phytec-headless-image 没有QT支持

phytec-qt5demo-image 有QT

也可以自己定义image的名称。

这样生成的sdk就可以用于如QT程序开发这样的工作。

生成的SDK位于 build/deploy/sdk/

xxx@xxx-virtual-machine:~/BSP-Yocto-AM335x-PD17.1.1/build$ bitbake -c populate_sdk phytec-headless-image
Loading cache: 100% |############################################| Time: 0:00:03
Loaded 2743 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies


Build Configuration:
BB_VERSION        = "1.32.0"
BUILD_SYS         = "x86_64-linux"
NATIVELSBSTRING   = "Ubuntu-16.04"
TARGET_SYS        = "arm-phytec-linux-gnueabi"
MACHINE           = "phycore-r2-am335x-2"
DISTRO            = "yogurt"
DISTRO_VERSION    = "BSP-Yocto-AM335x-PD17.1.1"
TUNE_FEATURES     = "arm armv7a vfp thumb neon       callconvention-hard       cortexa8"
TARGET_FPU        = "hard"
meta              
meta-poky         = "HEAD:e2fcc721c2af8e2785a91eaceea1d81f503ea2ec"
meta-oe           
meta-networking   
meta-python       
meta-multimedia   = "HEAD:b40116cf457b88a2db14b86fda9627fb34d56ae6"
meta-gstreamer1.0 = "HEAD:2c74a61e11c46d8bd5ebe4642292bc145e33d6d1"
meta-nodejs       = "HEAD:eec531e97a17bfd406f3bf76dee4057dcf5286a4"
meta-phytec       = "HEAD:72bd4d8b3f08fb51d591a4be4f63f21d53c1d71c"
meta-qt5          = "HEAD:2c9f0e4eb0e9097f6f872ec1e1d81768a8ab5f1b"
meta-yogurt       = "HEAD:cb43dd6f3bb1e149af67006feabc980121f2c995"


NOTE: Fetching uninative binary shim from http://downloads.yoctoproject.org/releases/uninative/1.7/x86_64-nativesdk-libc.tar.bz2;sha256sum=ed033c868b87852b07957a4400f3b744c00aef5d6470346ea1a59b6d3e03075e
WARNING: Disabling uninative as unable to fetch uninative tarball: Network access disabled through BB_NO_NETWORK (or set indirectly due to use of BB_FETCH_PREMIRRORONLY) but access requested with command /usr/bin/env wget -t 2 -T 30 -nv --passive-ftp --no-check-certificate -P /home/scw/BSP-Yocto-AM335x-PD17.1.1/build/downloads/uninative/ed033c868b87852b07957a4400f3b744c00aef5d6470346ea1a59b6d3e03075e 'http://downloads.yoctoproject.org/releases/uninative/1.7/x86_64-nativesdk-libc.tar.bz2' (for url None)
WARNING: To build your own uninative loader, please bitbake uninative-tarball and set UNINATIVE_TARBALL appropriately.
WARNING: /home/scw/BSP-Yocto-AM335x-PD17.1.1/sources/poky/../meta-phytec/recipes-kernel/linux/linux-ti_4.4.52-phy5.bb.do_compile is tainted from a forced run
Initialising tasks: 100% |#######################################| Time: 0:00:15
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks

Currently  1 running tasks (1188 of 3154)  37% |###########                    |

第一次编译的时间可能会很长,耐心等待。而且很可能出错(提示:关于BB_NO_NETWORK的错误),这时需要修改配置文件site.conf,该文件路径:/BSP-Yocto-AM335x-PD17.1.1/build/conf/ 下。  

打开site.conf文件,显示如下内容:

SOURCE_MIRROR_URL = "file://${TOPDIR}/../src_mirror"
INHERIT += "own-mirrors"
BB_GENERATE_MIRROR_TARBALLS = "1"
SCONF_VERSION = "1"

BB_NO_NETWORK = "1"

只需将最后一行 BB_NO_NETWORK = "1" 中的"1"改为"0"即可。然后重新执行第二步的命令。

3、生成的SDK位于 build/deploy/sdk/,进入此文件夹下,直接运行对应的 .sh文件就可以安装,执行安装文件:

xxx@xxx-virtual-machine:~/BSP-Yocto-AM335x-PD17.1.1/build/deploy/sdk$./phytec-yogurt-glibc-x86_64-meta-toolchain-cortexa8hf-neon-toolchain-AM335x-PD16.2.0.sh

安装后的的文件路径一般为:opt/yogurt/BSP-Yocto-AM335x-PD17.1.1/下。

4、激活交叉编译工具:交叉编译工具需要激活后方可使用

激活使用如下命令:source /opt/yogurt/BSP-Yocto-AM335x-PD17.1.1/environment-setup-cortexa8hf-neon-phytec-linux-gnueabi

然后使用:$CC 命令来编译目标文件即可。eg: $CC main.c -o main

5、下载编译后的可执行文件main到目标板运行。

<think>好的,用户想了解如何在Linux SDK中提取交叉编译工具链。首先,我需要回忆一下交叉编译工具链的基本概念。交叉编译工具链允许在一种架构的系统上编译另一种架构的程序,比如在x86主机上编译ARM目标板的程序。所以,用户可能是在进行嵌入式开发,需要为特定硬件准备编译工具。 接下来,用户提到的是从Linux SDK中提取。常见的SDK可能工具链、库、头文件等。可能需要确认SDK的结构,通常工具链可能位于类似toolchain/或类似目录下。例如,Buildroot或Yocto生成SDK通常会含一个sysroot和工具链。 然后,步骤可能括确定SDK结构,查找工具链路径,设置环境变量,或者将工具链独立打包。用户可能需要知道如何验证工具链是否可用,比如通过编译一个简单的C程序。 需要注意的点括:不同SDK的结构可能不同,比如OpenWRT、Buildroot或厂商提供的SDK可能有不同的目录布局。环境变量如PATH需要正确设置,或者使用绝对路径调用工具链中的编译器。可能还需要处理库依赖,比如sysroot中的库是否正确链接。 用户可能的实际需求是,他们有一个现成的SDK,但需要将工具链单独提取出来,以便在其他地方使用或分发给团队。因此,步骤可能需要详细说明如何定位工具链的可执行文件(如gcc、strip等),以及相关的库和头文件。 另外,权限问题可能需要注意,比如工具链是否可执行,或者是否需要安装额外的依赖库。还有可能需要处理动态链接库的问题,如果工具链是动态链接的,可能需要配置LD_LIBRARY_PATH或者静态编译的工具链更便于移植。 最后,测试提取后的工具链是否有效,例如用arm-linux-gnueabihf-gcc -v检查版本,编译一个简单的Hello World程序,用file命令确认生成的二进制是否正确的目标架构。</think>在嵌入式开发中,从Linux SDK中提取交叉编译工具链可分为以下几个关键步骤: $$工具链路径 = SDK根目录/toolchain/目标架构/编译器版本/$$ 一、准备工作 1. 确认SDK结构(常见布局): - `/toolchain`:存放交叉编译器 - `/sysroot`:含目标系统的头文件和库 - `/bin`:预编译工具和脚本 - `/configs`:配置文件模板 二、提取核心步骤 1. 定位工具链目录 ```bash find SDK路径 -name "*gcc" -type f # 搜索编译器本体 ``` 2. 验证工具链完整性(应含以下组件): - `bin/`:编译器可执行文件(如arm-linux-gnueabihf-gcc) - `lib/`:依赖库(libstdc++.so等) - `include/`:标准头文件 - `sysroot/`:目标系统库和头文件 3. 环境变量配置示例 ```bash export TOOLCHAIN_DIR=/opt/my_toolchain export PATH=$TOOLCHAIN_DIR/bin:$PATH export CROSS_COMPILE=arm-linux-gnueabihf- export CC=${CROSS_COMPILE}gcc ``` 三、验证工具链有效性 1. 版本检查 ```bash $ arm-linux-gnueabihf-gcc -v 2>&1 | grep "gcc version" ``` 2. 交叉编译测试 ```c // test.c #include <stdio.h> int main() { printf("Cross-compile OK\n"); return 0; } ``` 编译命令: ```bash $ arm-linux-gnueabihf-gcc test.c -o test_arm $ file test_arm # 应显示ARM可执行文件格式 ``` 四、打包工具链(可选) ```bash tar czvf toolchain.tar.gz \ --transform 's,^,toolchain/,' \ bin/ lib/ include/ sysroot/ ``` 常见SDK类型处理技巧: 1. Buildroot输出SDK: - 工具链路径:`output/host/usr/bin/` - 使用`make sdk`生成独立工具链 2. Yocto生成工具链: ```bash $ source poky/oe-init-build-env $ bitbake meta-toolchain ``` 注意事项: 1. 架构匹配:确认工具链与目标设备的CPU架构(armv7/armv8/mips等)一致 2. 动态链接处理:使用`ldd`检查依赖库 3. 版本兼容性:GLIBC版本需不低于目标系统版本 4. 调试符号:建议保留`.debug`目录用于后续调试 典型错误排查: - 错误提示:"No such file or directory" → 确认是否安装32位兼容库(对x86_64主机) ```bash sudo apt-get install lib32z1 # Ubuntu/Debian示例 ``` - 错误提示:"GLIBC_XX not found" → 需升级目标系统或降级工具链版本 通过以上步骤,即可从Linux SDK中有效提取交叉编译工具链,验证其可用性。实际开发中建议将工具链路径写入`~/.bashrc`或项目配置文件中实现持久化配置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值