C/C++编译调试

0x01 在命令行中编译链接

1.1 gcc最基本的用法:

gcc [options] [filenames]

其中,options就是编译器所需要的参数,filenames给出相关的文件名称。

不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。

最常用的有以下参数:

**-o 输出文件名
确定输出文件的名称。同时这个名称不能和源文件同名。**如果不给出这个选项,gcc就给出默认的可执行文件 a.out 。

-g
产生符号调试工具(GNU的 gdb)所必要的符号信息。想要对源代码进行调试,就必须加入这个选项。

-c
只编译,不链接成为可执行文件。编译器只是由输入的 .c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-O
对程序进行优化编译、链接。采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些,而且对执行文件的调试会产生一定的影响,造成一些执行效果与对应源文件代码不一致等一些令人“困惑”的情况。因此,一般在编译输出软件发行版时使用此选项。

-O2
比 -O 更好的优化编译、链接。当然整个编译链接过程会更慢。

1.2 编译过程的分步执行:

源代码到可执行文件
  1. 预编译。将源代码.c文件和相关.h头文件,预编译成一个.i文件。主要是处理以“#”开始的预编译指令,如“#define"宏定义展开,”#include"头文件展开。
  2. 编译。将预编译生成的.i文件,编译成.s汇编代码文件。主要进行词法分析、语法分析、语义分析以及目标代码生成与优化。
  3. 汇编。将编译生成的.s汇编代码文件,汇编生成.o目标文件(二进制文件)。每个.c源文件分别对应生成一个汇编代码文件,再对应生成一个.o目标文件。
  4. 链接。将汇编生成的.o目标文件,和库(一组目标文件的包),链接成.out可执行文件。分为静态链接和动态链接。静态链接主要包括地址和空间分配、符号决议、重定位(目标文件包含重定向,链接重定位计算地址。)

相关参数

为了更好地理解gcc的工作过程,我们可以让在gcc工作的4个阶段中的任何一个阶段中停止下来。相关的参数有:

  • -E
    预编译后停下来,可使用-o生成后缀为 .i 的预编译文件。
  • -S
    编译后停下来,生成后缀为 .s 的汇编源文件。
  • -c
    汇编后停下来,生成后缀为 .o 的目标文件。
  • 没有参数
    链接后生成后缀为 .out 的目标文件。

1.3 警告提示功能参数:

-pedantic

当gcc在编译不符合ANSI/ISO C 语言标准的源代码时,将产生相应的警告信息。

-Wall

能够使 gcc 产生尽可能多的警告信息。gcc 给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用 gcc 编译源代码时始终带上 -Wall 选项,这对找出常见的隐式编程错误很有帮助。

-Werror

要求 gcc 将所有的警告当成错误进行处理,这在使用自动编译工具(如 Make 等)时非常有用。如果编译时带上 -Werror 选项,那么 gcc 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进。

1.4 其他参数:

-W

以-g,-f,-m,-O,-W或–param开头的选项会自动传递给gcc调用的各个子进程。为了将其他参数传递给这些进程,必须使用-W 选项。

-l

链接时装载名为 lib.a 的函数库。该函数库位于系统默认的目录或者由 -L 选项确定的目录下。例如,-lm 表示链接名为 libm.a 的数学函数库。

1.5 通常:

C:

gcc -g a.c -o a

C++:

g++ -g a.cpp -o a

-g:编译会加入调试信息,否则无法调试执行文件;a.c和a.cpp:要编译的源文件;a:要生成的可执行文件。

0x02 gdb调试

进入调试:

gdb a

调试命令:

C/C++编译调试_第1张图片

图片来自https://blog.csdn.net/wfdtxz/article/details/7368357

动态显示代码:

使用如下命令启动gdb: gdb -tui main 或者在启动gdb后, 输入命令focus或layout。

你可能感兴趣的:(C++,基础)