linux下c程序编译过程及GCC,G++, GDB简介

来源:互联网 发布:一个服务器两个域名 编辑:程序博客网 时间:2024/05/01 18:03

 GCC/G++是linux下非常著名的自由软件, 主要用于对C/C++程序进行编译,使之成为一个可执行文件,其基本格式为:

gcc  [options] [file-name]

g++ [options] [file-name]

其中options为一些编译选项,主要选项包括-c, -g, -o 输出文件名, -O, -O2, -I 目录名, -L 目录名

-c: 表示只编译,不连接.编译器只将.c编译成.o文件, 而不将其连接成可执行文件, 通常用在编译不带主程序的子程序中. 此选项包含了预处理-E和汇编-S.

-g: 这个选项主要是产生符号调试工具, 如gdb所需要的调试标准信息, 如在gdb对程序进行调试时, 如果需要通过-l查看源代码在通过-b设置断点来调试时, 在编译源代码时必须包含-g选项.

-o 输出文件名: 该选项主要用于指定输出的可执行文件的文件名, 若不指定, 默认为a.out

-O, -O2均为设定在编译程序时,对源代码的优化等级, 优化后的代码执行效率会更高, 但编译, 连接过程可能会变慢, 同时, 优化等级不能过高, 否则可能会造成程序出错. 在对代码进行调试阶段, 一般不进行优化.

-I 目录名, 该选项是预编译过程中使用的选项, 表示在头文件的搜索路径列表中添加指定的目录, 如若要使用mysql安装目录下的文件 -I /usr/share/mysql/lib

-L 目录名, 表示在库文件搜索路径列表中添加指定的目录, 如当使用POSIX多线程的时候, 需要使用 -L pthread编译选项, 才能使程序中可以引用pthread多线程库中的函数

还有gcc与g++的区别在于: gcc认为预处理后的文件为c文件, 并且设定c形式的连接;  而g++认为是c++文件, 并且设定c++形式的连接. 同时g++可以同时编译c和c++程序.


 以上简单介绍了gcc/g++下的几个重要的编译选项, 接下来谈一些c程序在编译过程中, 所经历的四个阶段:

将一个c程序文件编译成一个可执行文件一般经历预处理, 编译, 汇编和连接四个阶段:

预处理: 该阶段主要对源代码中的文件包含, 如对该项目中其他文件的include, 宏定义, 预编译语句进行分析和替换, 如将宏进行简单的字符串替换.

编译: 编译阶段主要是根据编译器的语法规则, 将高级语言文件编译成以.s结尾的汇编语言文件.

汇编: 汇编阶段主要是将.s或.S文件汇编成.o目标文件, 目标文件为二进制文件, 但是还不是可执行文件.

连接: 将汇编阶段产生的.o文件连接起来, 将它们发在可执行文件中的合适位置, 同时将程序中使用到的库文件连接到可执行文件的合适位置, 最终形成一个可执行的二进制文件.


接下来介绍一些linux下对c程序进行调试时比较常用的工具gdb:

gdb是unix/linux下一个强大的调试工具, 它的功能包括:

运行程序 -r

设置断点: -b 行号

监视程序变量的值 -p 变量名(打印输出)

程序的单步执行: -s

修改变量的值

查看源代码 -l (前提是编译是由-g编译选项)

查看程序出错的地方: where

0 0