预处理、编译、汇编、链接
gcc -E
hello.c —> hello.i
gcc -S
hello.i —> hello.s
检查语法规范
gcc -c
hello.s —> hello.o
将汇编指令翻译成机器码
至于-o 是指定完成处理后的文件名
编译消耗资源、系统资源最多。
gcc -I
指定头文件位置
头文件hello.h
#include
源文件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指定了头文件的所在目录
生成二进制文件hello.o
g++ -c hello.cpp
在windows界面,可以直接使用vs去调试,
但在linux是使用gdb去调试的,要生成可调试的链接文件,必须假如-g
g++ -g hello.cpp -o hello
n = 0 ~ 3,n越大,优化越大
int main(){
int a = 10;
int b = 10; //unused variable 非重要警告信息
printf("----%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,当想要使用这个测试语句,只要动态注册宏,就可以重新拿来使用。