GCC编译器
GCC 编译器在我们 Ubuntu 的时候就已经默认安装好了,但默认是x86架构的。
GCC编译出现问题
执行gcc main.c -o main
类似命令时,报错,未满足依赖关系。
多半是镜像源跟你的ubuntu系统版本不匹配导致的。
通过 lsb_release -a
查看Ubuntu的版本号,
修改源—sudo vim /etc/apt/sources.list
在该文件最后添加下面内容,以Ubuntu20.04为例。
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
接下来,执行下面两条命令:
sudo apt-get update
sudo apt-get upgrade
最后执行命令:
sudo apt-get install libc6-dev
然后编译时 gcc main.c -o main
,就不会出错了。
注意:
不要误以为gcc只能用来编译C文件,这是不对的。gcc也可以编译C++文件,只是gcc不能自动联接C++程序使用的库,即链接过程我们不能用gcc。而g++实际上在编译C++文件时也是使用gcc编译器,在链接时才使用g++。
交叉编译器
1、它肯定是一个 GCC 编译器。
2、这个 GCC 编译器是运行在 X86 架构的 PC 上的。
3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的。
I.MX6ULL 交叉编译器:arm-linux-gnueabihf-
arm架构,linux环境,gnueabihf表示嵌入式二进制接口
查看版本号
gcc -v // 查看GCC编译器的版本号
最下面“gcc version 11.4.0”说明本机的 GCC 编译器版本为 11.4.0的。
“Target: x86_64-linux-gnu”一行,这说明 Ubuntu 自带的 GCC 编译器是针对 X86 架构的,因此只能编译在 X86 架构 CPU 上运行的程序。如果想要编译在 ARM上运行的程序就需要针对 ARM 的 GCC 编译器,也就是交叉编译器。
编译文件
gcc main.c // 编译,编译完成以后会生成一个 a.out 文件:可执行文件(gcc编译器自动命名)
gcc main.c -o main //-o:指定编译生成的可执行文件的名字为main
./main // 执行代码
gcc命令
gcc [选项] [文件名字]
编译流程
-
预处理
展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中
-
编译
将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译
-
汇编
将汇编语言文件编译成二进制目标文件
-
链接
将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题