124 Linux C++ 系统编程3 Linux gcc 4步分析,gcc参数详解。gcc build 出错在4步骤的哪些中,build error 的错误信息提示一般是啥

本文详细介绍了gcc编译器的工作步骤,包括预处理(头文件展开、宏替换、注释去除)、编译(语法检查和代码转换)、汇编(生成二进制指令)和链接(数据合并与地址分配)。同时讨论了gcc编译参数的应用,如头文件路径指定、调试信息添加和编译时宏定义的使用,以及可能遇到的错误和解决方法。
摘要由CSDN通过智能技术生成

gcc 编译可以执行程序4步分析

预处理:头文件展开,宏替换,注释去掉

编译:检查语法错误,将c语言变成汇编语言,消耗时间和系统资源最多

汇编:将汇编语言变成 二进制指令

链接:数据段合并以及地址回填,将函数库中相应的代码组合到目标文件中

gcc编译参数

gcc nginx.c -o b.out -I /home/hunandede/head/ -g

-I 表示指定头文件的位置,在 /home/hunandede/head/下,-I 和 头文件位置中间没有空格。

-g 表示 包含调试信息。加上-g 就可以使用GDB工具调试了。

-Wall 提示更多的警告信息,假设代码中我们有一个int a ,但是这个a 从来没有使用过,就会有警告在编译阶段出现。 这个一般也在GDB调试的时候加上。

-D<DEF> 编译时定义一个宏,类似于在代码中有一个宏定义

我们来看一段代码,在main函数中要打印 HI,但是这个HI 只有在定义了HELLODEBUG 这个宏的时候才会有值:如下code

#include <stdio.h>

#define HELLODEBUG
#ifdef HELLODEBUG

#define HI 20
#endif // HELLODEBUG


int main() {
	printf("HI = %d\n",HI);
	return 0;
}

如果我们现在将代码中 如下的一行删除了,那么肯定就有build error 了

#define HELLODEBUG    //删除了

改动代码为:

#include <stdio.h>

//#define HELLODEBUG
#ifdef HELLODEBUG

#define HI 20
#endif // HELLODEBUG


int main() {
	printf("HI = %d\n",HI);
	return 0;
}

hunandede@hunandede-virtual-machine:~/aaa$ gcc cptest.c -o cptest.out -g -Wall
cptest.c: In function ‘main’:
cptest.c:11:21: error: ‘HI’ undeclared (first use in this function)
  printf("HI = %d\n",HI);
                     ^
cptest.c:11:21: note: each undeclared identifier is reported only once for each function it appears in
hunandede@hunandede-virtual-machine:~/aaa$ 

这时候这个 -D<DEF> 就有用了,可以改动为

gcc cptest.c -o cptest.out -g -Wall -D HELLODEBUG

hunandede@hunandede-virtual-machine:~/aaa$ gcc cptest.c -o cptest.out -g -Wall -D HELLODEBUG
hunandede@hunandede-virtual-machine:~/aaa$ ./
b.out       cptest.c    cptest.out  nginx.c     test.c      test.out
hunandede@hunandede-virtual-machine:~/aaa$ ./cptest.out 
HI = 20
hunandede@hunandede-virtual-machine:~/aaa$ 

有啥用? 开发阶段加 log

#include <stdio.h>


int main() {
	#ifdef MTKDEBUG
	    printf("debug on goingi\n");
	#endif

	

	return 0;
}

在代码开发阶段,就可以加上这个参数,开发完成后,编译的时候只要不加这个 宏就没有问题了。

hunandede@hunandede-virtual-machine:~/aaa$ gcc canusetest.c -o canusetest.out 
hunandede@hunandede-virtual-machine:~/aaa$ ./canusetest.out 
hunandede@hunandede-virtual-machine:~/aaa$ gcc canusetest.c -o canusetest.out -D MTKDEBUG
hunandede@hunandede-virtual-machine:~/aaa$ ./canusetest.out 
debug on goingi
hunandede@hunandede-virtual-machine:~/aaa$ 

gcc编译阶段可能出错的地方和信息:

预处理 可能会出错,这时候错误信息会包含行号

编译     可能会出错,这时候错误信息会包含行号

汇编      一般汇编不会出错

连接     可能会出错,由于已经经过了汇编,因此错误在这里不会有行号,会有collect2:error :ld returned 1 exit status 之类的提示;一般情景:当我们使用 静态库和动态库的时候,

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值