Ubuntu下对gcc、g++以及交叉编译器工具的理解

  • @前言
  • @gcc、g++工具是干什么的?
  • @X86架构Ubuntu18.04下的gcc与g++工具
  • 1、gcc工具的安装与使用:
  • 2、g++工具的安装与使用:
  • @ARM架构Ubuntu18.04下的gcc与g++工具
  • 1、gcc工具的安装与使用:
  • 2、g++工具的安装与使用:
  • @交叉编译器实现跨平台编译C与C++代码
  • 1、arm-linux-gcc交叉编译器的安装与使用
  • 2、arm-linux-g++交叉编译器的安装与使用
  • 3、交叉编译器的运行参考图
  • @参考文档


@前言

由于项目需求,需要对C、C++代码进行编译以生成可执行文件,过程中接触学习了gcc、g++以及交叉编译器的下载1与使用方法,根据我的理解,现做以下总结。才疏学浅,如有问题,请随时留言以纠正!

@gcc、g++工具是干什么的?

简单的来说,gcc、g++就是将你的C、C++等代码生成可执行的文件(可供机器运行的机器码),大多数情况下gcc用于编译C代码,g++用于编译C++代码,但并不局限这样,gcc也可以编译C++代码,g++也可以编译C代码,具体gcc与g++区别可见参考链接2

@X86架构Ubuntu18.04下的gcc与g++工具

X86架构Ubuntu18.04是在Win10电脑虚拟机中运行。

1、gcc工具的安装与使用:

安装gcc编译工具

max@ubuntu:~/Documents$  sudo apt-get install gcc

创建.c文件

max@ubuntu:~/Documents$  touch main.c

编辑 main.c

max@ubuntu:~/Documents$  gedit main.c

在 main.c 文件中输入一下代码:

#include <stdio.h>
int main()
{
	printf("Hello World!\n");
	return 0;
}

使用gcc编译main.c文件

max@ubuntu:~/Documents$  gcc main.c

运行生成的a.out可执行文件(当前目录下,默认情况下生成的文件名)

max@ubuntu:~/Documents$  ./a.out

输出:

Hello World!

go语言交叉编译 arm g++交叉编译_g++

2、g++工具的安装与使用:

安装gcc编译工具

max@ubuntu:~/Documents$  sudo apt-get install g++

创建.cpp文件

max@ubuntu:~/Documents$  touch main.cpp

编辑 main.cpp

max@ubuntu:~/Documents$  gedit main.cpp

在 main.cpp 文件中输入一下代码:

#include <stdio.h>
int main()
{
	printf("Hello World!\n");
	return 0;
}

使用g++编译main.cpp文件

max@ubuntu:~/Documents$  g++ main.cpp

运行生成的a.out可执行文件(当前目录下,默认情况下生成的文件名)

max@ubuntu:~/Documents$  ./a.out

输出:

Hello World!

go语言交叉编译 arm g++交叉编译_go语言交叉编译 arm_02

@ARM架构Ubuntu18.04下的gcc与g++工具

Arm架构Ubuntu18.04是在Arm芯片的开发板中运行。

1、gcc工具的安装与使用:

安装gcc编译工具

root@ubuntu:~/Documents$  sudo apt-get install gcc

创建编辑.c文件和X86平台一致…
结果如下:

Hello World!

go语言交叉编译 arm g++交叉编译_交叉编译_03

2、g++工具的安装与使用:

安装g++编译工具

root@ubuntu:~/Documents$  sudo apt-get install g++

创建编辑.cpp文件和X86平台一致…
结果如下:

Hello World!

go语言交叉编译 arm g++交叉编译_linux_04

@交叉编译器实现跨平台编译C与C++代码

交叉编译器的功能,就是在不同的架构平台下实现代码的编译工作,举个例子:目前我们在X86架构Ubuntu下写好了C或C++代码,想在X86架构下的Ubuntu系统中直接编译出ARM架构Ubuntu中可运行的可执行文件,那么就需要在我们X86平台中安装交叉编译器,使用交叉编译器对代码进行编译。下面围绕这个例子做个展示。

arm-linux-gcc / arm-linux-g++ 交叉编译器就是在x86架构的Ubuntu(linux)下实现代码ARM架构可执行文件的编译。

1、arm-linux-gcc交叉编译器的安装与使用

安装arm-linux-gcc:

max@ubuntu:~/Documents$  sudo apt-get install gcc-arm-linux-gnueabihf

使用相同的main.c文件,使用arm-linux-gcc进行编译,编译后的可执行文件名字为 “1”

max@ubuntu:~/Documents$  arm-linux-gnueabihf-gcc -o 1 main.c

运行执行后的可执行文件

max@ubuntu:~/Documents$  ./1

得到报错!

bash: ./1: cannot execute binary file: Exec format error

这是因为咱们编辑了ARM架构Ubuntu(linux)下可运行的文件,在X86平台并不能运行。
将1文件拷贝至ARM板中,运行发现:

Hello World!

2、arm-linux-g++交叉编译器的安装与使用

安装arm-linux-g++:

max@ubuntu:~/Documents$  sudo apt-get install g++-arm-linux-gnueabihf

使用相同的main.cpp文件,使用arm-linux-g++进行编译,编译后的可执行文件名字为 “2”

max@ubuntu:~/Documents$  arm-linux-gnueabihf-g++ -o 2 main.cpp

运行执行后的可执行文件

max@ubuntu:~/Documents$  ./2

得到报错!

bash: ./2: cannot execute binary file: Exec format error

这是因为咱们编辑了ARM架构Ubuntu(linux)下可运行的文件,在X86平台并不能运行。
将2文件拷贝至ARM板中,运行发现:

Hello World!

3、交叉编译器的运行参考图

X86架构平台下的运行界面:

go语言交叉编译 arm g++交叉编译_g++_05


ARM架构平台下的运行界面:

go语言交叉编译 arm g++交叉编译_go语言交叉编译 arm_06