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编译四步曲的主要内容,如果未能解决你的问题,请参考以下文章

GCC编译四步标准

gcc之编译4步曲

如何将javascript代码编译为c++或java

GCC:编译成程序集并明确与代码的对应关系?

make cmake catkin_make

C程序存储结构