交叉编译环境
- 格式:ppt
- 大小:281.00 KB
- 文档页数:24
交叉编译环境以及开发板上-binsh:.hello:notfound(使⽤arm-linu。
⽬标板是S3C2440.⾄于交叉编译环境的搭建就不多说了,⽹上很多教程.搭建好了交叉编译环境后,第⼀件事就是传说中的”Hello,World!”.⼀. 主机编译环节我使⽤的系统是ubuntu10.04,搭建好交叉编译环境后,终端输⼊arm-linux-gcc -v能够正常显⽰版本信息,但是输⼊sudo arm-linux-gcc -v后却显⽰命令⽆法找到.我试过很多种⽅法,⽐如sudo -s切换到root后,编辑$PATH,将编译器路径加⼊.然后exit到普通⽤户.仍然不能执⾏sudo arm-linux-gcc -v. 这⾥如果哪位⼤⽜知道是什么原因的可以留⾔告诉我,谢谢:)由于编译.c的⽂件后,要产⽣新的⽂件,因此要super的权限.⼜不能使⽤sudo arm-linux-gcc,于是可以先sudo -s到root⽤户,再使⽤arm-liunux-gcc来进⾏编译.⼆. ⽬标板执⾏环节我是使⽤FTP在主机和⽬标板之间传送⽂件.传送过去后要注意改变权限.这⾥要注意⼏点:1. 要确定ftp过来后的⽂件的默认的存放路径.这个只要在⽬标机的终端机上确认下即可.(这个地⽅没有确认可能就会显⽰找不到命令)2. 传送过来的⽂件要更改权限才能运⾏.可以⽤:chmod 777 hellochmod +x hello3. 执⾏./hello这时,报错:-/bin/sh: ./hello: not found三. 问题排除⽤过绝对路径也试过之后就确定并不是⽂件是否存在的问题,⽽是这个⽂件并不能被执⾏.GOOGLE之后可以发现,排除上⾯提到问题后,就将问题定位到动态链接库上.于是在主机上⽤arm-linux-gcc -static -o 来进⾏静态编译.然后将新产⽣的⽂件传到⽬标板上.可以发现通过静态编译的⽂件明显⽐动态编译的要⼤.然后再次执⾏./hello 可以看到屏幕上出现了久违的Hello,World!问题到这⾥还没有完,我们可以再思考下怎么彻底解决,⽽不是每次都使⽤静态编译.既然是动态库引起的问题,那么应该和编译器的版本有关.在安装编译环境的时候同时安装了3.4.1和4.3.3两个版本.⽤户⼿册上说其中3.4.1是⽤来编译u-boot的,4.3.3版本是⽤来编译Linux内核和Qtipia的,两个版本均可以⽤来编译应⽤程序.既然我们的内核使⽤4.3.3编译的,⽽我们刚才编译hello是使⽤3.4.1编译的,那么会不会是这个原因呢?于是我们试⼀下,将$PATH中的原来包含3.4.1/bin 的路径改为 4.4.3/bin . 修改的⽅法⽹上有很多.(直接export PATH=”想要的路径”)再次编译,下载.⽬标板上执⾏,成功显⽰”Hello,World!”.可以看到系统中动态库的⽀持和编译器还是有关的./lzjsky/p/3730183.html。
linux交叉编译环境搭建步骤在Linux系统下搭建交叉编译环境主要涉及以下几个步骤:2. 配置环境变量:将交叉编译工具链的路径添加到系统的环境变量中以便于使用。
可以在用户的`.bashrc`或`.bash_profile`文件中添加如下行:```bashexport PATH=<path_to_toolchain>/bin:$PATH```其中`<path_to_toolchain>`是指交叉编译工具链所在的路径。
3.设置目标平台的系统根目录:交叉编译时需要使用目标平台的系统库和头文件,因此需要设置目标平台的系统根目录。
可以通过以下方式设置:```bashexport SYSROOT=<path_to_sysroot>```其中`<path_to_sysroot>`是指目标平台的系统根目录。
4.编写一个简单的交叉编译项目:为了验证交叉编译环境是否搭建成功,可以编写一个简单的交叉编译项目进行测试。
例如,编写一个简单的C程序,将其交叉编译为ARM平台下的可执行文件。
```c#include <stdio.h>int maiprintf("Hello, world!\n");return 0;```将上述代码保存为`hello.c`文件。
然后,使用以下命令进行交叉编译:```basharm-linux-gnueabi-gcc -o hello hello.c```编译完成后,会生成一个名为`hello`的可执行文件。
在ARM平台上执行该可执行文件,将输出`Hello, world!`。
以上就是在Linux系统下搭建交叉编译环境的基本步骤。
根据具体的需求,可能还需要进行其他的配置和设置。
教你如何在优麒麟上搭建RISC-V交叉编译环境由于 RISC-V 设备价格昂贵、不易采购等诸多原因,许多⼩伙伴虽然很感兴趣,但仍⽆法参与 RISC-V 开发⼯作,今天就教⼤家如何在优麒麟上搭建 RISC-V 交叉编译环境,快学起来吧!交叉编译(Cross Compile)指编译代码的平台,和执⾏编译后源代码的平台是两个不同的平台,⽐如在 x86/Linux 平台下使⽤交叉编译⼯具链编译 ARM/Linux 平台下的可执⾏⽂件。
今天我们要讲的就是在优麒麟(x86/Linux)上编译 RISC-V 架构可执⾏⽂件的⽅法。
我们为什么需要交叉编译呢,主要有以下考虑:01.性能与速度交叉编译的⽬标平台往往 CPU 性能较差,内存和磁盘性能也可能不能满⾜编译的要求,这时候就要依赖性能资源更好的编译主机进⾏编译。
02.缺乏编译条件就算⽬标平台性能⾜够且资源充⾜,可以本地编译,但第⼀个在⽬标平台运⾏的本地编译器总是需要我们通过交叉编译获得。
03.软件编译环境⼀个完整的 Linux 发⾏版需要由数百个包构成,⽽我们往往只关注需要在⽬标主机上安装的包,所以我们可以在交叉编译的主机上配置这些环境,⽽不是把时间浪费在配置⽬标主机的编译依赖上。
本⽂包含以下两部分:1、如何搭建⼀个 RISC-V 的交叉编译环境。
2、交叉编译 Linux 内核。
⼀、搭建 RISC-V 交叉编译环境。
通常来讲,在搭建交叉编译环境时需要考虑不同体系架构的不同特性,包括 CPU 架构是 64 位还是 32 位系统、字节序是⼤端( big-endian )或⼩端( little-endian )、内存字节对齐⽅式等,不过好在 RISC-V 已经有完善的⼯具链,包含交叉编译所需的 binutils 、 gcc 和 glibc 3 个部分。
●⾸先需要 RISC-V 交叉编译⼯具链,如果⽹络较慢,可以忽略其中的 qemu ⼦项⽬git clone --recursive https:///riscv/riscv-gnu-toolchain这是 RISC-V 的 C/C++ 交叉编译⼯具链,其⽀持两种构建模式:1. 通⽤ ELF/Newlib ⼯具链2. Linux-ELF/glibc ⼯具链●安装所需依赖包sudo apt-get install -y autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libncurses-dev device-tree-compiler libssl-dev gdisk swig ●接下来开始编译cd riscv-gnu-toolchain./configure --prefix=/opt/riscv(路径可以根据个⼈习惯⾃定义)sudo make linux -j `nproc`编译完成后,刚才指定的路径 opt/riscv/bin 下会⽣成以下⽂件:可以将这个路径添加到环境变量中:export PATH=/opt/riscv/bin:$PATH也可以添加到:echo "export PATH=/opt/riscv/bin:$PATH" >> ~/.bashrc到这⾥我们就完成了交叉编译所需环境的搭建。
ubuntu下搭建MIPS交叉编译环境 由于要在本地编译程序,在嵌⼊式系统上运⾏,因此需要在本地装编译器,⽬前主要需要mipsel-linux-gcc。
之前⼀直以为可以⽤apt-get install找到,结果找了好久找不到,发现还是得⾃⼰编。
主要是参考上⾯的那个链接,然后这对⾃⼰需求改了改配置。
1. 环境系统:Ubuntu 16.04软件: buildroot该软件可以编译⽤于 mips, arm等等的C编译器。
2. 下载tar -jxvfcd buildroot3. 配置buildroot (重要)make cleanmake menuconfig会出现选择菜单,如下图:选择第⼀项“Target Architecture”, 改成 MIPS (little endian)另外,选择“Toolchain”, 将"kernel headers"改成⾃⼰主机上的Linux版本(及运⾏改编译器的主机)可以在主机上通过 uname -r 或者 cat /proc/version查看。
原⽣的是只有gcc部分,没有g++部分,需要对编译C++程序,则在菜单⾥选择 Enable c++选项(按 y 选取)。
⽤于编译python的配置选项我主要⽤这个来编译python放在嵌⼊式设备系统上⽤,最开始就按照上⾯的选项,编译⼀般的程序没问题,编译python会出现:unknow type name 'wchar_t' 错误,这个需要在这⾥的⼯具⾥选⼏个选项;a1. 在配置⾥选择对wchar的⽀持;a2. 退出Target options,进⼊Target packages,在Target packages⾥再添加⼏个选项(这⾥我没看不配置这个会出什么问题,这个⾥⾯到底做什么的,我直接按照进⼊Interpreter lanaguages and scripting 选项,选择python选项,然后吧core python modules⾥的都选了吧~(编译⼀次太费时了,缺个什么⼜得重新编译这个⼯具链)配置完了后,保存,并退出。
使用cmake-gui交叉编译CMake是一个跨平台跨编译器的编译工具,它可以简化编译和构建过程。
CMake-GUI是一个基于图形界面的版本,它可以更直观地配置和构建项目。
下面是使用CMake-GUI进行交叉编译的步骤:1. 准备交叉编译环境。
为目标平台准备好交叉编译器,并安装好必要的依赖库,同时建议将交叉编译器路径添加到环境变量中。
2. 安装CMake-GUI。
在Windows下,CMake-GUI可以通过官方网站免费下载并安装。
在Linux下,可以通过包管理器安装,如Ubuntu下通过以下命令安装:```bashsudo apt-get install cmake-qt-gui```3. 创建工程目录。
在交叉编译环境中,创建一个新的项目目录。
使用CMake-GUI时,建议将源代码和构建目录分开存放,创建一个名为"build"的目录作为构建目录。
4. 配置项目。
双击运行CMake-GUI,并打开刚刚创建的工程目录。
在源代码目录和构建目录中分别选择所需的路径。
接着点击"Configure"按钮,选择交叉编译器平台,选择平台后,点击“Finish”按钮开始生成。
在点击"Configure"按钮前,需要注意:- 交叉编译器的路径在Windows和Linux下是不一样的,需要根据实际情况修改;- 如果需要添加自定义的编译选项,可以在"CMakeLists.txt"文件中添加。
5. 构建项目。
在CMake-GUI界面中,设置好编译选项,如编译类型、编译优化级别等。
然后点击"Generate"按钮,开始构建项目。
如果构建成功,我们可以在构建目录中看到生成的二进制可执行文件。
至此,我们使用CMake-GUI完成了交叉编译操作。
需要注意的是,交叉编译的过程可能因环境、依赖库等多种因素出现问题,需要根据具体情况进行调整。
[转]qt-4.7交叉编译-mikit的专栏-CSDN博客[转]qt-4.7交叉编译收藏一:环境介绍虚拟机:vmware 7.0Linux 环境:ubuntu 9.04交叉编译环境:arm-linux-g++ 3.4.5硬件平台:TQ2440二:移植步骤安装交叉编译环境由于这里使用的是QT2440管盘中提供的交叉编译工具链EABI-4.3.3_EmbedSky_20100610.tar.bz2,放在/opt/目录下解压主要是在解压后可以看到其中含有两个版本,由于qt4.7.0的编译必须使用3.4.5版本所以在设置交叉编译的路径的时候使用的是在/etc/profile中加入exportPATH=/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH安装tslib1.41. 下载tslib1.4,解压2. 进入解压的目录运行执行./autogen.sh3. 执行./configure --prefix=/opt/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes ,经过一段时间的编译4. 执行make install5. 修改/opt/tslib/etc/ts.conf,把第二行的#号去掉(这样做的主要目的是为了在移植到板子上的时候,可以制定输入模块)6. 在/etc/profile中加入export PATH=/opt/tslib:$PATHPS:经过我的测试,我无法用以上的方法编译tslib1.4,我用的是另外一种方法:1、 ./autogen.sh #用于生成configure脚本2、 echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache#产生一个cache文件arm-linux.cache,欺骗configure,3、 CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/opt/tslib --cache-file=arm-linux.cache4、 make5、 make install交叉成功后在目标位置产生/bin、/etc、/include、/lib 4个文件夹编译qt4.7.0-arm1. 下载qt-everwhere-opensource-4.7.0,并解压最好重命名qt-everwhere-opensource-4.7.0-qte2. 开始进行配置选项./configure -embedded arm -release -opensource -fast -no-accessibility -no-scripttools -no-mmx -no-multimedia -no-svg -no-3dnow -no-sse -no-sse2 -silent -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-multimedia -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-g++ -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-glib -qt-mouse-tslib -I /opt/tslib/include -L /opt/tslib/lib -confirm-license "$@"3. 开始进行交叉编译gmake 此过程要经历很长的一段时间4. 在交叉编译成功后运行gmake install安装,这里会默认安装到/usr/local/Trolltech/QtEmbedded-4.7.0-arm5. 这个时候qte的编译就成功了制作根文件系统(移植到开发板)1.移植tslib,将ubuntu中的/opt/tslib 拷贝到根文件系统中的/opt/下面2.移植qte4.7.0将/usr/local/Trolltech/QtEmbedded-4.7.0-arm下面的lib文件夹拷贝到根文件中的相同目录下(必需得先创建相应的目录)注:此时可以根据需要裁剪lib 中的内容去掉不用的.so文件3. 增加新的显示中文的字体wenquanyi 放到上面的/lib/fonts目录下。
qnx 交叉编译
QNX是一种实时操作系统,常常被用于开发嵌入式系统和工业控制设备。
要进行QNX交叉编译,可以按照以下步骤进行:
1.安装交叉编译环境:首先,需要在本地的机器上安装交叉编译环境。
这个环境通常
包括编译器、链接器和其他一些必要的工具。
2.配置目标系统:你需要配置目标系统,也就是你希望运行的设备。
这通常涉及到指
定设备的处理器架构、内存大小等参数。
3.创建交叉编译工具链:基于目标系统的配置,你可以创建一个交叉编译工具链。
这
个工具链包括一些特定的编译器、链接器和其他工具,它们都是针对目标系统的架构进行优化的。
4.编写代码并交叉编译:使用交叉编译工具链,你可以将你的源代码编译成目标系统
可以执行的二进制文件。
5.部署和测试:最后,你需要将编译后的二进制文件部署到目标系统上,并进行测试
以确保一切正常工作。
具体操作中,你需要根据你的设备和项目需求进行一些相应的调整和配置。
注意,由于QNX 的版本和具体硬件设备可能会影响交叉编译的过程,所以建议在实际操作前仔细阅读相关的文档和教程。
有关Xavier交叉编译环境那些事前⾔最近公司升级交叉编译环境,需要配置的⽬标机为Nvidia AGX xavier with Jetpack 4.5这⾥记录⼀些坑。
正⽂总体概要所谓cross-compile其实就是在amd64(下称host)上⽣成arm64(下称target)的binary明确⼀点,所有与编译相关的⼯具都是运⾏在本地,⽐如cmake⽐如aarch64-gcc⽐如tclsh版本为host⽽对应的rootfs可以简单理解为库,所有编译过程中需要的.so .a都会在rootfs⾥⾯找,版本为target⾄于cuda这种⽐较特殊的交叉编译,就需要host_bin(例如nvcc)+ target_lib(例如libcublas.so)进⾏配合莫慌,上述这些Nvidia SDK manager会提供下载。
前期准备从SDKmanager下载到的sample rootfs⾥⾯不含任何nv三⽅库,需要⾃⼰安装deb通过SDK manager可以下载对应型号的rootfs+三⽅库以及CUDA交叉环境,其中的json⽂件将指导每个deb的具体安装host这边安装好cmake, autoconf, automake, libtool, m4 and tclsh这些编译相关⼯具,准备好与target⼀致的aarch64-gcc-7.5仿真环境使⽤qemu对target环境进⾏模拟,对应命令sudo apt install qemu-user-static注意不要装错了⾄此host已经具备执⾏target bin的能⼒,直接chroot将报错failed to run command ‘/bin/bash’: No such file or directory复制对应的⽂件sudo cp /usr/bin/qemu-aarch64-static <rootfs>/usr/bin/有了这两步就可以chroot到target rootfs进⾏操作sudo chroot <rootfs> /bin/bash成功后使⽤uname -a检查架构是否为aarch64装依赖库理论上我们可以通过chroot + qemu的⽅式进⼊target rootfs进⾏包管理apt install ...但这样⽐较费时费⼒更糟糕的是,现阶段SDK manager刷机后半段会通过ssh访问Xavier安装⼀些在线内容,如此⼀来本地deb安装可能不全我个⼈建议使⽤sample_rootfs作为底包并从刷好的Xavier迁移/usr /lib /opt /etc进⾏覆盖升级完成后更新整个rootfs的符号链接为相对路径symlinks -cr /此举可避免编译过程中rootfs中的⽂件链接到host 效果如下:更新前<rootfs>/etc/resolv.conf -> /run/resolvconf/resolv.conf更新后<rootfs>/etc/resolv.conf -> ../run/resolvconf/resolv.conf打包技巧可以使⽤fakeroot替代sudo实现对rootfs的去权限打包,解压也不再需要root权限。