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
- linux下c程序编译过程及GCC,G++, GDB简介
- Linux下编译调试C程序(GCC,GDB)
- Linux下的简单C程序gcc编译、gdb调试。
- windows下建立gcc/g++/gdb/make编译及调试C/C++的IDE环境
- windows下建立gcc/g++/gdb/make编译及调试C/C++的IDE环境
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
- gcc简介及编译过程
- linux下GCC编译C程序
- linux下gcc编译c程序
- Linux下用gcc编译c程序
- linux下GCC编译C程序(一)
- Linux 下 C 编译gcc与调试gdb工具介绍
- gcc 学习笔记(一) - 编译C程序及编译过程
- Linux下用g++编译c程序
- Linux下C/C++编译器GCC/G++使用简介
- Linux下C/C++编译器GCC/G++使用简介
- linux下 gcc,gdb 运行和调试c程序
- 各种机器学习方法概念
- 客运综合管理系统项目—售票管理(售票)
- 2015年百度之星程序设计大赛 - 资格赛 1005 下棋
- python学习笔记第一课_Phoenix-晶
- Android SlidingMenu 使用详解
- linux下c程序编译过程及GCC,G++, GDB简介
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- WCF医院管理系统技术解析(三)体检登记(二)
- CSS权值
- POJ 2142 扩展欧几里得
- Project Euler:Problem 12 Highly divisible triangular number
- ubantu下如何完全彻底卸载mysql
- 英语六级、考研高频词汇
- OC视频笔记3.1(Foundation框架,NSObject里面的方法)3.2(isKindOfClass和isMemberOfClass)