GCC编译和GDB调试

时间:2021-01-07 08:14:57

一、编译

1、gcc编译器
gcc编译器(GNU CC)是GNU项目中符合ANSI C标准的编译系统,是一个强大的编译器。能够编译C/C++,Objective-C等。

2、编译流程
1)预处理(Pre-Processing)
对处理头文件(#include)、宏定义(#define、#ifdef)等进行处理。

        gcc -E xx.c -o xx.i
2)编译(Compiling)
    检查代码的规范性,语法错误等。
        gcc -S xx.i -o xx.s
3)汇编(Assembling)
    形成目标文件。
        gcc -c xx.s -o xx.o
4)连接(Linking)
    使用函数库:静态库(.a)和动态库(.so)等。
        gcc xx.o -o xx

GCC编译选项:

选项 含义
-c 只编译不链接,生成目标文件“.o”
-S 只编译不汇编。
-E 只进行编译
-g 在可执行程序中包含调试信息
-o file 将file文件至指定输出文件
-v 打印编译器内部编译过程的命令行信息和编译器版本
-I dir 头文件所在的目录
-static 进行静态编译
-shared 1、生成动态库文件。2、进行动态编译。(默认)
-L dir 添加库文件目录
-lname 连接libname.a或libname.so库文件
-fPIC 生成使用相对地址的位置无关的目标代码
-ansi 支持ANSI标准的C程序
-pedantic 允许发出ANSI C标准的全部警告信息
-pedantic-error 允许发出ANSI C标准的全部错误信息
-w 关闭所有警告
-Wall 允许发出gcc提供的所有警告信息
-Werror 允许发出gcc提供的所有错误信息

例子:
1、静态库的编译和调用

/* pow.c程序 */
unsigned int pow(usigned int a)
{
    return a * a;
}

创建pow_test.c文件,调用pow.c函数。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    unsigned int a = 9;
    int res = pow(a);
    printf("a^2 = %d", res);
    return 0;
}

编译库文件

~# gcc -c pow.c
~# ar rcsv libpow.a pow.o
   a - pow.o

编译主程序:

~# gcc pow_test.c -o pow_test -lpow
~# ./pow_test 
a^2 = 81

2、编译动态链接库
step1: 以第一个例子里的简单代码为例子,首先利用-fPIC构建一个目标文件:

~# gcc -fPIC -Wall -c pow.c

step2: 生成动态链接库

~# gcc -shared -o libpow.so pow.o

step3:验证主程序:

~# gcc -o pow_tst pow_test.c -L. -lpow
~# ./pow_tst
    a^2 = 81

二、GDB调试器