GCC调试基础知识

本文详细介绍了GCC编译器的基础知识,包括警告信息的显示、C语言标准的选择、编译预处理、多文件编译和连接、生成不同格式的文件,以及调试和优化选项。强调了-Wall选项的使用、头文件的包含路径、静态库与共享库的连接,并给出了静态库和共享库创建的示例。此外,文章还提到了调试信息的添加与代码优化的注意事项,如-O2级别的优化适合大多数情况。
摘要由CSDN通过智能技术生成
The History of GCC

  --------------------------------------------------------------------------------

  1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。

  GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言越来越多,它的名称变成了GNU Compiler Collection。

  这里介绍的gcc是GCC的前端,C编译器.

  警告信息

  --------------------------------------------------------------------------------

  -Wall : 显示所有常用的编译警告信息。

  -W    : 显示更多的常用编译警告,如:变量未使用、一些逻辑错误。

  -Wconversion : 警告隐式类型转换。

  -Wshadow : 警告影子变量(在代码块中再次声明已声明的变量)

  -Wcast-qual :警告指针修改了变量的修饰符。如:指针修改const变量。

  -Wwrite-strings : 警告修改const字符串。

  -Wtraditional : 警告ANSI编译器与传统C编译器有不同的解释。

  -Werror : 即使只有警告信息,也不编译。(gcc默认:若只有警告信息,则进行编译,若有错误信息,则不编译)

  C语言标准

  --------------------------------------------------------------------------------

  你可以在gcc的命令行中通过指定选项来选择相应的C语言标准: 从传统c到最新的GNU扩展C. 默认情况下, gcc使用最新的GNU C扩展.

  -ansi : 关闭GNU扩展中与ANSI C相抵触的部分。

  -pedantic          : 关闭所有的GNU扩展。

  -std=c89           : 遵循C89标准

  -std=c99           : 遵循C99标准

  -std=traditional : 使用原始C

  注意:后4个选项可以与-ansi结合使用,也可以单独使用。

  可在gcc中使用大量GNU C扩展.

  生成特定格式的文件

  --------------------------------------------------------------------------------

  以hello.c为例子,可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件:

  hello.c : 最初的源代码文件;

  hello.i : 经过编译预处理的源代码;

  hello.s : 汇编处理后的汇编代码;

  hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。

  hello / a.out : 最终的可执行文件

  (还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)

  如果你不通过-o指定生成可执行文件名,那么会默认生成a.out. 不指定生成文件名肯能覆盖你上次生成的a.out.

  e.g.

  $ gcc hello.c

  在不给gcc传递任何参数的情况下, gcc执行默认的操作: 将源文件编译为目标文件--> 将目标文件连接为可执行文件(名为a.out) --> 删除目标文件.

  -c生成.o文件时,默认生成与源代码的主干同名的.o文件。比如对应hello.c生成hello.o. 但也可在生成目标文件时指定目标文件名(注意同时要给出.o后缀): $ gcc -c -o demo.o demo.c

  $ gcc -Wall -c hello.c              : 生成hello.o

  $ gcc -Wall -c -save-temps hello.c : 生成hello.i, hello.s, hello.o

  注意-Wall 选项的使用场合:仅在涉及到编译(即会生成.o文件时,用-Wall)

  多文件编译、连接

  --------------------------------------------------------------------------------

  如果原文件分布于多个文件中:file1.c, file2,c

  $ gcc -Wall file1.c file2.c -o name

  若对其中一个文件作了修改,则可只重新编译该文件,再连接所有文件:

  $ gcc -Wall -c file2.c

  $ gcc file1.c file2.o -c name

  注意:若编译器在命令行中从左向右顺序读取.o文件,则它们的出现顺序有限制:含有某函数定义的文件必须出现在含有调用该函数的文件之后。好在GCC无此限制。

  编译预处理

  --------------------------------------------------------------------------------

  以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc中指定-E选项,或直接调用cpp.gcc的编译预处理命令程序为cppÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值