[转] Linux GCC 编译使用
GCC使用
在使用GCC编译程序时,编译过程可以被细分为四个阶段:
预处理(Pre-Processing)
编译(Compiling)汇编(Assembling)
链接(Linking)。
例如:
#include
int main(void)
{
printf ("Hello world, Linux programming!\n");
return 0;
}
然后执行下面的命令编译和运行这段程序:
# gcc hello.c -o hello
#
./hello
Hello world, Linux programming!
GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。
第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:
# gcc -E hello.c -o
hello.i
此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
# gcc -c hello.i -o
hello.o
GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:
# gcc hello.o -o hello
在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设
有一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令:
# gcc foo1.c foo2.c -o
foo
如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:
# gcc -c foo1.c -o foo1.o
#
gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo
在项目文件代码较多时,还要借助
像Make这样的工具。
GDB调试:
列文件清单
List
(gdb) list line1,line2
显示数据
print
检查各个变量的值(gdb)
print p (p为变量名)
whatis
显示某个变量的类型 (gdb)
whatis p
断点(breakpoint)
break
line-number 使程序恰好在执行给定行之前停止。
break
function-name 使程序恰好在进入指定的函数之前停止。
break
line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
break
routine-name 在指定例程的入口处设置断点
(gdb) break
filename:line-number
如果该程序是由很多原文件构成的,在各个原文件中设置断点
(gdb) break
filename:function-name
要想设置一个条件断点,可以利用break
if命令,如下所示:
(gdb) break
line-or-function if expr 例:(gdb)
break 46 if testsize==100
countinue 命令
断点继续运行
显示当前gdb的断点信息:
(gdb) info break
会以如下的形式显示所有的断点信息:
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in
init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in
init_organ at qsort2.c:168 (gdb)
删除指定的某个断点: (gdb)
delete breakpoint 1 该命令将会删除编号为1的断点,
如果不带编号参数,将删除所有的断点
(gdb) delete breakpoint
禁止使用某个断点 (gdb)
disable breakpoint 1 该命令将禁止断点 1,同时断点信息的
(Enb)域将变为 n
允许使用某个断点 (gdb)
enable breakpoint 1 该命令将允许断点 1,同时断点信息的
(Enb)域将变为 y
清除原文件中某一代码行上的所有断点
(gdb)clean number
注:number 为原文件的某个代码行的行号
信号
gdb
通常可以捕捉到发送给它的大多数信号,通过捕捉信号,例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正
的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某
些调试操作。
Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么
转载于:https://www.cnblogs.com/Shirlix/p/5772744.html
[转] Linux GCC 编译使用相关推荐
- Linux gcc编译c/c++基本过程
Linux系统下开发c++程序,那么gcc编译器就是我们绕不过去的一道坎.gcc是GNU出品的一款可以在多种硬件平台上编译处可执行程序的超级编译器,其执行效率比普通的编译器要高出20%~30%左右,而 ...
- linux gcc编译C程序 分享
一个c语言程序从源文件到生成可执行文件,编译器需要共经历4个步骤: 1) 预处理:把c文件中预处理命令扫描处理完毕,即对源代码文件中的文件包含(#include).预编译语句(如宏定义#define等 ...
- linux gcc编译undefined reference to `stricmp'问题
最近gcc编译遇到这样的问题:undefined reference to `stricmp'. 查了下,stricmp是Windows特有函数. 解决方法: stricmp是Microsoft's ...
- Linux gcc编译过程及动态/静态库制作
Linux库概念及如何制作静态库和动态库 1: gcc编译的过程 2: 分文件编程 3: 库(静态库和动态库) 3.1: 库的基本介绍 3.2: 静态和动态库的区别 3.3: 库的制作及使用 3.3. ...
- linux gcc编译常见问题,常见gcc编译警告整理以及解决方法 - 常见gcc编译警告整理以及解决方法...
三.常见gcc编译警告整理以及解决方法 1.warning: no newline at end of file 在文件最后一行加上回车键 解释:在<Rationale for the C99 ...
- linux gcc 编译找不到头文件,找不到库
找不到头文件 解决方式 (头文件均为编译时刻使用) 1.把头文件路径写成绝对路径,把路径写全,如 (相对路径也行) #include "/usr/include/stdio.h" ...
- linux gcc编译c文件头文件,使用GCC编译器编译C语言
GCC编译C源代码有四个步骤:预处理-->编译-->汇编-->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序的编译来演示 ...
- linux gcc编译错误:statically linked applications requires at runtime the shared libraries
statically linked applications requires at runtime the shared libraries from the glibc version used ...
- Linux gcc编译简介、常用命令
gcc作为linux平台下的标准C编译器,功能很强大.格式如下: gcc [option] [filename] -x language 指定使用的语言 -c 对文件进行编译和汇编,但不进行连接 -S ...
最新文章
- Oracle RAC CSS 超时计算 及 参数 misscount, Disktimeout 说明
- Spring 的 BeanFactory 和 FactoryBean 傻傻分不清?
- python 3d绘图 拖动_使用python-matplotlib连续3D绘图(即图形更新)?
- html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染
- EmguCV 一些基本操作
- 类与对象和对应方法、封装
- C++学习之路 | PTA乙级—— 1042 字符统计 (20 分)(精简)
- 【云栖大会】创无止境 YunOS云栖大会诠释万物互联
- ATMEGA128——初探
- 如何理解 Python 之禅:Explicit is better than implicit?
- 掘金8000亿早教市场,启蒙APP们还面临哪些难题?
- 【Excel】【行列转换:转置粘贴 or TRANSPOSE】
- android获取手机信息的权限,如何开启获取手机信息权限
- 计算机科学与技术导论结课报告,计算机科学与技术导论论文提纲范文模板 计算机科学与技术导论论文框架怎样写...
- 怎样更改计算机文件名,电脑如何批量修改文件名|批量修改文件名的几个小方法...
- 如何判断数字里含有某数字
- 高校研究生在微博留下绝笔后于实验室自杀,谁来关心研究生压力?
- mysql_java.sql.SQLException: null, message from server: Host 'xxx' is not allowed to connect
- 基于PHP的网上鲜花销售系统
- MSIL Instruction Set
热门文章
- 显示串中只出现一次的字符.
- [转]C++基础:C++的结构struct
- 开发部署提速8倍!这款IDE插件了解一下?
- Codeforces.959E.Mahmoud and Ehab and the xor-MST(思路)
- iOS tableview性能优化及分析
- eclipse设置java虚拟机内存大小
- JavaScript实现私有属性
- 【环境】VS2013和MATLAB相互调用混合编程
- APP如何保存数据?——iOS保存数据的4种方式
- UML中聚合和组合的关系(笔记)