1106|0

185

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

【米尔 NXP i.MX93 开发板评测】buildroot交叉编译实践 [复制链接]

本帖最后由 小麦克 于 2024-8-14 16:30 编辑

buildroot交叉编译实践

buildroot用来作为嵌入式linux系统开发还是非常方便的,编译器配置为buildroot自动生成。

ubootlinux内核采用开发板自带的。通过buildroot制作rootfs,然后再使用buildroot制作交叉编译的环境。这个环境中包含了我们之前加入的库,我们开发新的app就可以交叉编译并链接。

编译

当前的buildroot配置如下(保存为myirdeconfig放到configs目录)

  1. BR2_aarch64=y
  2. BR2_cortex_a55=y
  3. BR2_ARM_FPU_VFPV4D16=y
  4. BR2_KERNEL_HEADERS_6_1=y
  5. BR2_PACKAGE_GLIBC_UTILS=y
  6. BR2_TOOLCHAIN_BUILDROOT_CXX=y
  7. BR2_PACKAGE_HOST_GDB=y
  8. BR2_INIT_SYSTEMD=y
  9. BR2_SYSTEM_DHCP="eth0"
  10. BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin"
  11. BR2_PACKAGE_ALSA_UTILS=y
  12. BR2_PACKAGE_ALSA_UTILS_ALSACONF=y
  13. BR2_PACKAGE_ALSA_UTILS_ACONNECT=y
  14. BR2_PACKAGE_ALSA_UTILS_ALSALOOP=y
  15. BR2_PACKAGE_ALSA_UTILS_ALSAUCM=y
  16. BR2_PACKAGE_ALSA_UTILS_ALSATPLG=y
  17. BR2_PACKAGE_ALSA_UTILS_AMIDI=y
  18. BR2_PACKAGE_ALSA_UTILS_AMIXER=y
  19. BR2_PACKAGE_ALSA_UTILS_APLAY=y
  20. BR2_PACKAGE_ALSA_UTILS_APLAYMIDI=y
  21. BR2_PACKAGE_ALSA_UTILS_ARECORDMIDI=y
  22. BR2_PACKAGE_ALSA_UTILS_ASEQDUMP=y
  23. BR2_PACKAGE_ALSA_UTILS_ASEQNET=y
  24. BR2_PACKAGE_ALSA_UTILS_BAT=y
  25. BR2_PACKAGE_ALSA_UTILS_IECSET=y
  26. BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y
  27. BR2_PACKAGE_FFMPEG_GPL=y
  28. BR2_PACKAGE_FFMPEG_NONFREE=y
  29. BR2_PACKAGE_FFMPEG_FFPLAY=y
  30. BR2_PACKAGE_FFMPEG_FFPROBE=y
  31. BR2_PACKAGE_FFMPEG_POSTPROC=y
  32. BR2_PACKAGE_FLAC=y
  33. BR2_PACKAGE_GSTREAMER1=y
  34. BR2_PACKAGE_GSTREAMER1_CHECK=y
  35. BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y
  36. BR2_PACKAGE_GST1_PLUGINS_BAYER2RGB_NEON=y
  37. BR2_PACKAGE_GST1_PLUGINS_GOOD=y
  38. BR2_PACKAGE_GST1_LIBAV=y
  39. BR2_PACKAGE_VLC=y
  40. BR2_PACKAGE_TREE=y
  41. BR2_PACKAGE_MMC_UTILS=y
  42. BR2_PACKAGE_LIBPJSIP=y
  43. BR2_PACKAGE_DHCPCD=y
  44. BR2_PACKAGE_FREESWITCH=y
  45. BR2_PACKAGE_OPENSSH=y
  46. BR2_PACKAGE_TCPDUMP=y
  47. BR2_PACKAGE_VSFTPD=y
  48. BR2_PACKAGE_UTIL_LINUX_LIBFDISK=y
  49. BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y
  50. BR2_PACKAGE_UTIL_LINUX_KILL=y
  51. BR2_PACKAGE_UTIL_LINUX_LSFD=y
  52. BR2_PACKAGE_UTIL_LINUX_MORE=y
  53. BR2_TARGET_ROOTFS_EXT2=y
  54. BR2_TARGET_ROOTFS_EXT2_SIZE="256M"
  55. BR2_TARGET_ROOTFS_TAR_GZIP=y
  56. BR2_PACKAGE_HOST_ENVIRONMENT_SETUP=y

注意这里打开了 BR2_PACKAGE_HOST_ENVIRONMENT_SETUP ,有了这个配置会生成output/host/environment-setup脚本,执行source命令即可当前开发环境设置为交叉编译,跨平台的cmake也搞好了,非常的方便。

配置并编译,等待编译成功

  1. make myirdeconfig
  2. make
  3. # 将当前的环境设置为交叉编译
  4. source output/host/environment-setup
  5. # 测试一下变量
  6. $ echo $CC
  7. aarch64-buildroot-linux-gnu-gcc

可以大概看一下environment-setup脚本为我们做的事情。导出了很多变量,还有configurecmake别名
编译cmake工程时,交叉编译配置都省了

  1. cat <<'EOF'
  2. _ _ _ _ _
  3. | |__ _ _(_) | __| |_ __ ___ ___ | |_
  4. | '_ \| | | | | |/ _` | '__/ _ \ / _ \| __|
  5. | |_) | |_| | | | (_| | | | (_) | (_) | |_
  6. |_.__/ \__,_|_|_|\__,_|_| \___/ \___/ \__|
  7. Making embedded Linux easy!
  8. Some tips:
  9. * PATH now contains the SDK utilities
  10. * Standard autotools variables (CC, LD, CFLAGS) are exported
  11. * Kernel compilation variables (ARCH, CROSS_COMPILE, KERNELDIR) are exported
  12. * To configure do "./configure $CONFIGURE_FLAGS" or use
  13. the "configure" alias
  14. * To build CMake-based projects, use the "cmake" alias
  15. EOF
  16. if [ x"$BASH_VERSION" != x"" ] ; then
  17. SDK_PATH=$(dirname $(realpath "${BASH_SOURCE[0]}"))
  18. elif [ x"$ZSH_VERSION" != x"" ] ; then
  19. SDK_PATH=$(dirname $(realpath $0))
  20. else
  21. echo "unsupported shell"
  22. fi
  23. export "AR=aarch64-buildroot-linux-gnu-gcc-ar"
  24. export "AS=aarch64-buildroot-linux-gnu-as"
  25. export "LD=aarch64-buildroot-linux-gnu-ld"
  26. export "NM=aarch64-buildroot-linux-gnu-gcc-nm"
  27. export "CC=aarch64-buildroot-linux-gnu-gcc"
  28. export "GCC=aarch64-buildroot-linux-gnu-gcc"
  29. export "CPP=aarch64-buildroot-linux-gnu-cpp"
  30. export "CXX=aarch64-buildroot-linux-gnu-g++"
  31. export "FC=aarch64-buildroot-linux-gnu-gfortran"
  32. export "F77=aarch64-buildroot-linux-gnu-gfortran"
  33. export "RANLIB=aarch64-buildroot-linux-gnu-gcc-ranlib"
  34. export "READELF=aarch64-buildroot-linux-gnu-readelf"
  35. export "STRIP=aarch64-buildroot-linux-gnu-strip"
  36. export "OBJCOPY=aarch64-buildroot-linux-gnu-objcopy"
  37. export "OBJDUMP=aarch64-buildroot-linux-gnu-objdump"
  38. export "AR_FOR_BUILD=/usr/bin/ar"
  39. export "AS_FOR_BUILD=/usr/bin/as"
  40. export "CC_FOR_BUILD=/usr/bin/gcc"
  41. export "GCC_FOR_BUILD=/usr/bin/gcc"
  42. export "CXX_FOR_BUILD=/usr/bin/g++"
  43. export "LD_FOR_BUILD=/usr/bin/ld"
  44. export "CPPFLAGS_FOR_BUILD=-I$SDK_PATH/include"
  45. export "CFLAGS_FOR_BUILD=-O2 -I$SDK_PATH/include"
  46. export "CXXFLAGS_FOR_BUILD=-O2 -I$SDK_PATH/include"
  47. export "LDFLAGS_FOR_BUILD=-L$SDK_PATH/lib -Wl,-rpath,$SDK_PATH/lib"
  48. export "FCFLAGS_FOR_BUILD="
  49. export "DEFAULT_ASSEMBLER=aarch64-buildroot-linux-gnu-as"
  50. export "DEFAULT_LINKER=aarch64-buildroot-linux-gnu-ld"
  51. export "CPPFLAGS=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
  52. export "CFLAGS=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g0 -D_FORTIFY_SOURCE=1"
  53. export "CXXFLAGS=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g0 -D_FORTIFY_SOURCE=1"
  54. export "LDFLAGS="
  55. export "FCFLAGS= -O2 -g0"
  56. export "FFLAGS= -O2 -g0"
  57. export "PKG_CONFIG=pkg-config"
  58. export "STAGING_DIR=$SDK_PATH/aarch64-buildroot-linux-gnu/sysroot"
  59. export "INTLTOOL_PERL=/usr/bin/perl"
  60. export "ARCH=arm64"
  61. export "CROSS_COMPILE=aarch64-buildroot-linux-gnu-"
  62. export "CONFIGURE_FLAGS=--target=aarch64-buildroot-linux-gnu --host=aarch64-buildroot-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var --program-prefix="
  63. alias configure="./configure ${CONFIGURE_FLAGS}"
  64. alias cmake="cmake -DCMAKE_TOOLCHAIN_FILE=$SDK_PATH/share/buildroot/toolchainfile.cmake -DCMAKE_INSTALL_PREFIX=/usr"
  65. export "PATH=$SDK_PATH/bin:$SDK_PATH/sbin:$PATH"

PSJIP测试

之前在开发板上面直接编译测试pjsip库,这次使用buildroot生成的交叉编译器来编译app调用pjsip

新建myapp.c

  1. #include <pjsua-lib/pjsua.h>
  2. #include <pj/log.h>
  3. int main()
  4. {
  5. pj_status_t status;
  6. status = pjsua_create();
  7. PJ_LOG(3,("myapp.c", "Hello PJSIP! Bye PJSIP."));
  8. pjsua_destroy();
  9. return 0;
  10. }

相同目录新建Makefile文件,变量PJDIR 需要根据实际情况调整。

  1. PJDIR = /home/bruce/Documents/buildroot/buildroot-2024.05.1/output/build/libpjsip-2.14
  2. include $(PJDIR)/build.mak
  3. myapp: myapp.o
  4. $(PJ_CC) -o $@ $< $(PJ_LDFLAGS) $(PJ_LDLIBS)
  5. myapp.o: myapp.c
  6. $(PJ_CC) -c -o $@ $< $(PJ_CFLAGS)
  7. clean:
  8. rm -f myapp.o myapp

编译

  1. make
  2. $ file myapp
  3. myapp: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 6.1.0, not stripped

生成成功,拷贝到开发板运行测试

结论

如果只是简单的交叉编译不依赖第三方库的应用程序还是挺简单的,但是一旦依赖第三方库交叉编译就会有各种奇怪的问题,buildroot为我们准备了非常好用的environment-setup

另外还可以搞个和目标机器相同的平台来编译软件。比如新建一个arm64的虚拟机直接编译,或者在arm64物理机(树莓派5)进行编译。编译好的软件可以直接拷贝到目标机器运行。

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表