armgcc交叉编译的文件无法运行_小话交叉编译的实现

armgcc交叉编译的文件无法运行_小话交叉编译的实现_第1张图片

前言

Install the ARM cross complier toolchain on your Linux Ubuntu PC

本文演示如何在Ubuntu的PC上安装完整的交叉编译工具链和交叉编译的完整实现。

完整的实现步骤已在如下系统环境下测试过:

  • Host:PC Ubuntu 18.04.05 LTS (x86_64)
  • Target: Raspberry Pi 4B Raspbian GNU/Linux 10 Buster (armv7l)

什么是交叉编译?&为什么需要交叉编译?

What is cross-compiliing? 交叉编译是一种能够编译可执行文件给项目编码开发的平台之外的平台。 这样讲起来会比较拗口。可以举个例子,如,在Windows 10 PC(x86 架构)上开发项目,编译成能够安卓系统(ARM 架构)上运行的文件的实现叫交叉编译器[1]。

Why do we need it? 因为直接在目标平台上编译可能不可行,有如下几个原因:

  1. Why we need it? 因为直接在目标平台上编译可能不可行,有如下几个原因:限而导致编译时间过ji长且可能出错失败。
  2. 在一些嵌入式设备系统中并没有包含操作系统, 没有编译的环境

因此我们需要交叉编译器将代码编译成目标平台下的可执行文件。

创建交叉编译环境,安装交叉编译器,工具依赖等

本文以安装Ubuntu 18.04 系统的 x86_64 PC 为例。如果使用的是window10 ,可以在Microsoft store安装Ubuntu18.04作为subsystem运行。

在Terminal输入如下command以安装GCC,G++ 交叉编译器和依赖

$ sudo apt-get update
$ sudo apt-get upgrade

## Install package dependencies
$ sudo apt-get install build-essential autoconf libtool cmake pkg-config git python-dev swig3.0 libpcre3-dev nodejs-dev

## For ARM 64bit toolchain
$ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

## For armv7l toolchain
$ sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

## For armv6 toolchain
$ sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi

安装成功后,恭喜你!交叉编译的环境准备好了,让我们进入下一个环节

可是,如何确定处理器的arm版本呢? 在Target machine 的 Terminal中 输入 uname -a 查看 例子如下:
$ uname -a
Linux raspberrypi49772a 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux

尝试交叉编译C

在编译之前准备好一个名为hello.c 的程序,作为源文件。

程序如下:

#include "stdio.h"

int main(void) {
      
  printf("Hello world!n");
  return 0;
}

接下来是使用arm-linux-gnueabihf-gcc 编译文件,输入如下command:

$ arm-linux-gnueabihf-gcc hello.c -o hello_for_armv7l

而后当前文件夹里会多一个叫 hello_for_armv7l 的可执行文件,把该文件复制到你的arm设备中,这里通过ssh传输文件到目标设备,command 如下:

$ scp hello_for_armv7l username@[your_device_ip]:/home/username/

But,在运行前,我们编译好的文件可能不被目标设备的系统识别成一个可执行文件,因此需设置该文件成一个可执行文件,输入如下command:

$ sudo chmod 777 hello_for_armv7l

而后运行该程序:

$ ./hello_for_armv7l
Hello world!

这就表明成功啦~

BTW, 如果在Host PC (x86 Machine)下运行会得到如下结果

$ ./hello_for_armv7l 
-bash: ./hello_for_armv7l: cannot execute binary file: Exec format error

而后是交叉编译C++

同样的,首先是创建一个名为hello.cc 的C++的测试程序,代码如下:

#include "iostream"
 
using namespace std;
 
int main(int argc, char *argv[]) {
      
    cout << "Hello world!" << endl;
    return 0;
}

接下来使用 arm-linux-gnueabihf-g++ command编译该文件成一个可执行文件

$ arm-linux-gnueabihf-g++ hello.cc -o hello_cc_armv7l_linux

剩下的步骤与上述的交叉编译C一致,参照上述的步骤~

Reference

  1. https://en.wikipedia.org/wiki/Cross_compiler#:~:text=A cross compiler is necessary,platforms from one development host.&text=In paravirtualization%2C one computer runs,source-to-source compilers.
  2. https://www.acmesystems.it/arm9_toolchain
  3. https://www.96boards.org/documentation/guides/crosscompile/commandline.html

你可能感兴趣的:(linux,编译c,snmp++,linux,编译出错)