「生活可以更简单, 欢迎来到我的开源世界」
  1. gcc编译器
  2. gdb调试器
gcc编译器、gdb调试器
2020-08-10
C++

著名的GNU家族的著名编译器gcc,著名调试器gdb。

gcc编译器

GCC : GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。

gcc是GCC中的GUN C Compiler(C 编译器)

g++是GCC中的GUN C++ Compiler(C++编译器)

gcc和g++的使用区别:

  1. 预处理(.i文件)(-E参数:仅作预处理,不进行编译、汇编或链接)

    g++ -E hello.cpp -o hello.i
  2. 编译生成汇编文件(.s文件)(-S参数:编译到汇编语言,不进行汇编和链接)

    g++ -S hello.i

    不用指定输出文件,生成同名.s文件

  3. 汇编生成目标代码文件(.o文件)(-c参数:编译、汇编到目标代码,不进行链接)

    g++ -c hello.s

    不用指定输出文件,生成同名.s文件

  4. 链接生成可执行文件(.out文件)

    g++ hello.o

    若不指定输出文件,则默认生成a.out,多次生成会覆盖

    链接可分为动态链接和静态链接:

    1. 动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。

      动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。

      Linux 下的动态链接库实际是共享目标文件(shared object),一般是.so 文件,作用类似于 Windows 下的.dll 文件

    2. 静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过体积较大。

      Linux 下静态库是汇编产生的.o 文件的集合,一般以.a 文件形式出现。

    gcc 默认是动态链接,加上-static 参数则采用静态链接。

    查看链接过程:

    g++ -v -o hello hello.o

    不链接系统标准启动文件和标准库文件:

    (常用于裸机/bootloader、linux内核等程序,因为它们不需要启动文件、标准库文件)

    g++ -v -nostdlib -o hello hello.o

    不链接系统标准启动文件,而标准库文件仍然正常使用:

    g++ -v -nostartfiles -o hello hello.o

gdb调试器

想要进行gdb调试,在编译时需要使用参数-g生成调试信息

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

启动gdb:gdb a.out

运行指令:

设置断点:

查看源代码:

打印表达式

查询运行信息

<⇧>