• 实现Ubuntu交叉编译程序和Nvida Nano运行程序


    Linux嵌入式学习笔记二

    实现Ubuntu交叉编译程序并通过SSH发送到Nvida Nano上运行程序



    前言

    最近在学习嵌入式Linux,遇到一些问题想要记录下来,实现Ubuntu交叉编译程序并通过SSH发送到Nvida Nano上运行程序,设备:一台装有Ubuntu系统(主机)的电脑,一个Nvida Nano。


    一、交叉编译是什么?

    由于嵌入式系统资源匮乏,一般不能像PC一样安装本地编译器和调试器,不能在本地编写,编译和调试自身运行的程序,而需借助其他系统如PC来完成这些工作,这样的系统通常称为宿主机。
    宿主机通常是 Linux 系统,并安装交叉编译器、调试器等工具;宿主机也可以是 Windows系统,安装嵌入式 Linux 集成开发环境。在宿主机上编写和编译代码,通过串口、网口或者硬件调试器将程序下载到目标系统里面运行
    所谓的交叉编译,就是在宿主机平台上使用某种特定的交叉编译器,为某种与宿主机不
    同平台的目标系统编译程序,得到的程序在目标系统上运行而非在宿主机本地运行。

    通俗点说就是:一般的电脑采用因特尔的CPU为X86架构,而Linux嵌入式系统为ARM架构,所以X86架构的编译出来的文件不可以给ARM架构的运行,所以要采用交叉编译来实现X86架构下的编译文件可以给ARM架构运行

    二、安装交叉编译工具

    采用的交叉编译工具为:aarch64-linux-gnu-gcc

    1.查看可以安装的版本

    在终端上输入:apt-cache search aarch64
    
    • 1
    有如下版本可以安装
    cpp-9-aarch64-linux-gnu - GNU C preprocessor
    cpp-aarch64-linux-gnu - GNU C preprocessor (cpp) for the arm64 architecture
    g++-9-aarch64-linux-gnu - GNU C++ compiler (cross compiler for arm64 architecture)
    g++-aarch64-linux-gnu - GNU C++ compiler for the arm64 architecture
    gcc-9-aarch64-linux-gnu - GNU C compiler (cross compiler for arm64 architecture)
    gcc-9-aarch64-linux-gnu-base - GCC,GNU 编译器套装(基本软件包)
    gcc-aarch64-linux-gnu - GNU C compiler for the arm64 architecture
    binutils-aarch64-linux-gnu - GNU binary utilities, for aarch64-linux-gnu target
    binutils-aarch64-linux-gnu-dbg - GNU binary utilities, for aarch64-linux-gnu target (debug symbols)
    qemu-efi-aarch64 - UEFI firmware for 64-bit ARM virtual machines
    qemu-system-arm - QEMU full system emulation binaries (arm)
    cpp-10-aarch64-linux-gnu - GNU C 预处理器
    g++-10-aarch64-linux-gnu - GNU C++ compiler (cross compiler for arm64 architecture)
    gcc-10-aarch64-linux-gnu - GNU C compiler (cross compiler for arm64 architecture)
    gcc-10-aarch64-linux-gnu-base - GCC,GNU 编译器套装(基本软件包)
    gccgo-10-aarch64-linux-gnu - GNU Go compiler
    gccgo-9-aarch64-linux-gnu - GNU Go compiler
    gccgo-aarch64-linux-gnu - Go compiler (based on GCC) for the arm64 architecture
    cpp-8-aarch64-linux-gnu - GNU C preprocessor
    g++-8-aarch64-linux-gnu - GNU C++ compiler (cross compiler for arm64 architecture)
    gcc-10-plugin-dev-aarch64-linux-gnu - Files for GNU GCC plugin development.
    gcc-8-aarch64-linux-gnu - GNU C compiler (cross compiler for arm64 architecture)
    gcc-8-aarch64-linux-gnu-base - GCC, the GNU Compiler Collection (base package)
    gcc-8-plugin-dev-aarch64-linux-gnu - Files for GNU GCC plugin development.
    gcc-9-plugin-dev-aarch64-linux-gnu - Files for GNU GCC plugin development.
    gccgo-8-aarch64-linux-gnu - GNU Go compiler
    gdc-10-aarch64-linux-gnu - GNU D compiler (version 2) (cross compiler for arm64 architecture)
    gdc-8-aarch64-linux-gnu - GNU D compiler (version 2) (cross compiler for arm64 architecture)
    gdc-9-aarch64-linux-gnu - GNU D compiler (version 2) (cross compiler for arm64 architecture)
    gdc-aarch64-linux-gnu - GNU D compiler (based on GCC) for the arm64 architecture
    gfortran-10-aarch64-linux-gnu - GNU Fortran compiler
    gfortran-8-aarch64-linux-gnu - GNU Fortran compiler
    gfortran-9-aarch64-linux-gnu - GNU Fortran compiler
    gfortran-aarch64-linux-gnu - GNU Fortran 95 compiler for the arm64 architecture
    gm2-10-aarch64-linux-gnu - GNU Modula-2 compiler (cross compiler for arm64 architecture)
    gm2-9-aarch64-linux-gnu - GNU Modula-2 compiler (cross compiler for arm64 architecture)
    gm2-aarch64-linux-gnu - GNU Modula-2 compiler (based on GCC) for the arm64 architecture
    gnat-10-aarch64-linux-gnu - GNU Ada compiler
    gnat-8-aarch64-linux-gnu - GNU Ada compiler
    gnat-8-sjlj-aarch64-linux-gnu - GNU Ada compiler (setjump/longjump runtime library)
    gnat-9-aarch64-linux-gnu - GNU Ada compiler
    gobjc++-10-aarch64-linux-gnu - GNU Objective-C++ compiler
    gobjc++-8-aarch64-linux-gnu - GNU Objective-C++ compiler
    gobjc++-9-aarch64-linux-gnu - GNU Objective-C++ compiler
    gobjc++-aarch64-linux-gnu - GNU Objective-C++ compiler for the arm64 architecture
    gobjc-10-aarch64-linux-gnu - GNU Objective-C compiler
    gobjc-8-aarch64-linux-gnu - GNU Objective-C compiler
    gobjc-9-aarch64-linux-gnu - GNU Objective-C compiler
    gobjc-aarch64-linux-gnu - GNU Objective-C compiler for the arm64 architecture
    pkg-config-aarch64-linux-gnu - manage compile and link flags for libraries for arm64 architecture
    qemu-efi - transitional dummy package
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    2.选择某个版本安装

    apt-get install gcc-10-aarch64-linux-gnu
    
    • 1

    3.验证是否安装成功

    如下图所示。

    dengbei@dengbei-ThinkPad-E480:~$ aarch64-linux-gnu-gcc -v
    Using built-in specs.
    COLLECT_GCC=aarch64-linux-gnu-gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
    Target: aarch64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.1' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
    Thread model: posix
    gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.编译程序

    事先在ubuntu上写了一个hello.c程序

    #include 
    
    
    /* 执行命令: ./hello weidongshan 
     * argc = 2
     * argv[0] = ./hello
     * argv[1] = weidongshan
     */
    
    int main(int argc, char **argv)
    {
    	if (argc >= 2)
    		printf("Hello, %s!\n", argv[1]);
    	else
    		printf("Hello, world!\n");
    	return 0;
    }
    
    //编译hello.c
    dengbei@dengbei-ThinkPad-E480:~$ aarch64-linux-gnu-gcc hello.c
    dengbei@dengbei-ThinkPad-E480:~$ aarch64-linux-gnu-gcc hello.c -o hello
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    会出现一个名叫hello的可执行文件,为64位的。
    在这里插入图片描述

    engbei@dengbei-ThinkPad-E480:~$ file hello
    hello: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=631c735d078c1f9b83a11ed94b4e919e54393346, for GNU/Linux 3.7.0, not stripped
    
    
    
    • 1
    • 2
    • 3
    • 4

    三、传输可执行文件并运行程序

    通过SSH将交叉编译出来的可执行文件发送Nvida Nano然后运行程序
    关于SSH连接的教程:SSH教程

    vidia@nvidia-desktop:~$ sudo scp dengbei@192.168.1.111:/home/dengbei/hello ./
    [sudo] password for nvidia: 
    dengbei@192.168.1.111's password: 
    hello                                         100% 9336     1.7MB/s   00:00    
    nvidia@nvidia-desktop:~$ ls
    Desktop    Downloads         hello    Music     Public     Videos
    Documents  examples.desktop  hello.c  Pictures  Templates
    nvidia@nvidia-desktop:~$ ./hello
    Hello, world!
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

  • 相关阅读:
    2022数学建模国赛降至,整理了一些很不错的在线网站分享一下
    结构体、枚举、位段、联合体详解
    安泰电压放大器在低频探测天线技术研究中的应用
    mysql进阶:企业数据库安全防护方案
    车牌检测识别功能实现(pyqt)
    找不到msvcp110dll,无法继续执行代码,msvcp110dll丢失是什么意思
    阿里巴巴技术官甩出的SpringCloud笔记,GitHub标星已突破82k
    vs工程添加自定义宏
    【编程题】【Scratch二级】2019.09 制作蝙蝠冲关游戏
    alginate-Ferrocene|海藻酸钠-二茂铁|二茂铁修饰改性海藻酸钠|海藻酸钠-peg-二茂铁
  • 原文地址:https://blog.csdn.net/weixin_43903002/article/details/126690399