gcc编译四步曲
Posted milaiko
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc编译四步曲相关的知识,希望对你有一定的参考价值。
gcc编译四步
预处理、编译、汇编、链接
预处理
gcc -E
hello.c —> hello.i
- 展开宏、头文件
- 替换条件编译
- 删除注释、空行、空白
编译
gcc -S
hello.i —> hello.s
检查语法规范
汇编
gcc -c
hello.s —> hello.o
将汇编指令翻译成机器码
至于-o 是指定完成处理后的文件名
链接
- 数据段合并
- 地址回填
总结
编译消耗资源、系统资源最多。
gcc编译参数
指定头文件目录 -I
gcc -I
指定头文件位置
头文件hello.h
#include<stdio.h>
源文件hello.cpp
#include"hello.h"
int main(){
printf("---");
}
mkdir inc #创建新目录
mv hello.h ./inc #将其当前目录下的hello.h移动到inc目录
g++ hello.cpp -o hello # 编译失败,因为hello.h不在本目录下
g++ -I ./inc hello.cpp -o hello #编译成功,-I指定了头文件的所在目录
只编译不生成链接 -c
生成二进制文件hello.o
g++ -c hello.cpp
调试 -g
在windows界面,可以直接使用vs去调试,
但在linux是使用gdb去调试的,要生成可调试的链接文件,必须假如-g
g++ -g hello.cpp -o hello
优化 -On
n = 0 ~ 3,n越大,优化越大
Wall 显示所有警告信息
int main(){
int a = 10;
int b = 10; //unused variable 非重要警告信息
printf("----%d"); //重要警告信息
}
-D 动态注册宏
假设下面有这条语句
#include"hello.h"
#ifdef HELLO
#define HI 20
#endif
int main(int argc, char *argv[]){
int b = 10;
int a = 10;
printf("------%d", HI);
return 0;
}
g++ hello.cpp -o hello
# 出错,没有HI这个变量
g++ hello.cpp -D HELLO -o hello
-D
等价与 #define HELLO
和#ifdef HELLO
对应,只有define HELLO了,才能够执行ifdef到endif里面的语句。
使用好处:
假设写了贼多的测试语句,当正式上线时,想要把测试语句删掉,可以制作一个开关#ifdef blabla,当想要使用这个测试语句,只要动态注册宏,就可以重新拿来使用。
以上是关于gcc编译四步曲的主要内容,如果未能解决你的问题,请参考以下文章