linux系统下通过GCC编译C/C++程序
gcc的编译过程
一、安装gcc编译器
通过命令gcc -v查看当前的GCC版本:
gcc -v
如下所示:
当出现如下问题:
Command ‘gcc’ not found, but can be installed with:sudo apt install gcc
解决办法:通过 sudo apt install gcc
安装gcc编译器
二、关于gcc编译器
- gcc是一个强大的工具集合,它包含了预处理器、编译器、汇编器、链接器等组件。它会在需要的时候调用其他组件。
- 输入文件的类型和传递给gcc的参数决定了gcc调用具体的哪些组件。
- 对于开发者,它提供的足够多的参数,可以让开发者全面控制代码的生成,这对嵌入式系统级的软件开发非常重要。
I、使用方法
gcc [选项] 文件名
II、常用选项
选项 | 含义 |
---|---|
-v | 查看gcc编译器的版本,显示gcc执行时的详细过程 |
-o [filename] | 指定输出文件名为file |
-E | 只预处理,不会编译、汇编、链接 |
-S | 只编译,不会汇编、链接 |
-c | 编译和汇编,不会链接 |
在vi/vim编辑器下编辑.c源文件
//testGcc.c
#include<stdio.h>
int main()
{
int i,j;
i = 0;
j = 0;
i = j+1;
printf("Hello World!\n");
printf("i=j+1%d\n",i);
return 0;
}
编译和运行:
gcc -o testGcc testGcc.c 一次编译(忽略中间过程)
./testGcc 运行
三、gcc编译C/C++的过程
一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)、和连接(linking)才能变成可执行文件。
hello.c → hello.i → hello.s → hello.o → hello
一、预处理
预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理。
使用 -E 参数输出文件的后缀名为:".cpp"
gcc -E -o testGcc.cpp testGcc.c (预编译)
使用wc命令比较预处理后的文件与源文件,对比两个文件的差异
wc testGcc.c testGcc.cpp
可以看到预处理之后的文件相比源文件变大了很多。
二、编译成汇编代码
预处理文件 → 汇编代码
gcc -x cpp-output -S -o testGcc.s testGcc.cpp
直接编译到汇编代码:gcc -S hello.c
三、汇编成目标代码
汇编代码 → 目标代码
gcc -x assembler -c testGcc.s
使用汇编器生成目标代码:
as -o testGcc.o testGcc.s
直接编译成目标代码:gcc -c testGcc.c
汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现位ELF目标文件(OBJ文件)。
四、链接
目标代码 → 执行代码
gcc -o testGcc testGcc.o
直接生成执行代码:gcc -o testGcc testGcc.c
链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。
注:汇编代码和执行代码都属于二进制代码
gcc 的高级选项:-Wall 打开所有的警告信息
gcc -Wall -o testGcc testGcc.c
推荐阅读
-
如何通过WASI SDK 在Linux上编译ZXing C++
-
9.26 在Linux系统下编写C程序
-
Linux环境下编译链接调试C/C++源程序
-
C++框架库POCO学习详情: Linux下的编译和安装
-
linux学习笔记——在ubuntu系统下编译运行c程序并使用makefile管理项目
-
Linux下使用VS Code + CMake 调试c++程序
-
Window系统下C/C++程序毫秒级和微秒级执行时间获取方法
-
利用Qt/C++在腾讯云/阿里云服务器搭建TCP/IP协议实现网络通信以及Qt在linux下的安装和程序打包踩坑(详解)
-
在Linux系统中使用GDB来调试C/C++程序的方法
-
win10 系统下sublime text3 下C/C++编译环境搭建