Linux系统C语言编译

Table of Contents

 

gcc

gcc编译流程:

总体参数

gcc的常用警告和出错参数 

优化参数

gdb

常用的gdb命令

用gdb调试程序


知识简介

编译  :把高级语言书写的代码转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确编译器就可以编译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在Linux 中默认后缀为“.o”(如“foo.c”的目标文件为“foo.o”)。

链接  :将多.o 文件,或者.o 文件和库文件链接成为可被操作系统执行的可执行程序(Linux 环境下,可执行文件的格式为“ELF”格式)。链接器不检查函数所在的源文件,只检查所有.o 文件中的定义的符号。将.o 文件中使用的函数和其它.o 或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序。链接过程使用 GNU 的“ld”工具。

静态库  :又称为文档文件(Archive File)。它是多个.o 文件的集合。Linux 中静态库文件的后缀为“.a”。静态库中的各个成员(.o 文件)没有特殊的存在格式,仅仅是一个.o 文件的集合。使用“ar”工具维护和管理静态库。

共享库  :也是多个.o 文件的集合,但是这些.o 文件时有编译器按照一种特殊的方式生成(Linux 中,共享库文件格式通常为“ELF”格式。共享库已经具备了可执行条件)。模块中各个成员的地址(变量引用和函数调用)都是相对地址。使用此共享库的程序在运行时,共享库被动态加载到内存并和主程序在内存中进行连接。多个可执行程序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不共享数据)。另外共享库的成员对象可被执行(由 libdl.so 提供支持)。

gcc

Linux下的c编译器中,gcc是功能最强大、使用最广泛的软件。

gcc是(GNU Cmpiler Collection的简称),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。

gcc不仅功能十分强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。

gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比,平均效率要高20%~30%。

gcc支持编译的后缀名:

后缀名对应语言后缀名对应语言
.cC原始程序.ii已经经过预处理的C++原始程序
.CC++原始程序.s汇编语言原始程序
.ccC++原始程序.S汇编语言原始程序
.cxxC++原始程序.h预处理文件(头文件)
.mObjective-C原始程序.o目标文件
.i已经经过预处理的c原始程序.a/.so编译后的库文件

 


gcc指令的一般格式为:
gcc [参数] 要编译的文件 [参数] [目标文件]

gcc 1-2.c -o 1-2

gcc编译流程:

 

  • 编辑源码程序代码
  • 预处理阶段:
    gcc 1-3.c -o 1-3.i -E

     

 

  • 编译阶段:
    gcc 1-3.i -o 1-3.s -S

     

  • 汇编阶段
    gcc 1-3.s -o 1-3.o -c

     

  • 链接阶段:完成链接后,gcc就可以生成可执行程序文件 

注意:gcc在编译的时候默认使用动态链接库,编译链接时并不把库文件的代码加入到可执行文件中,而是在程序执行的时候动态加载链接库,这样可以节省系统开销。


总体参数

参数含义参数含义
-c

只是编译不链接

-v显示gcc的版本信息
-S只是编译不汇编,生成汇编代码-I dir在头文件的搜索路径中添加dir目录
-E只进行预编译-L dir在库文件的搜索路径列表中添加dir目录
-g在可执行程序中包含调试信息-static链接静态库
-o file把输出文件输出到file中-l libra连接名为library的库文件

当头文件与gcc不在同一目录下要用-I dir编译,它是指头文件,而添加库文件时需用-L dir参数。

Linux下的库文件命名时有一个规定:必须以l、i、b三个字母开头,因此,在用“-l”指定链接库文件时可以省去l、i、b三个字母。也就是说“-llibsunq”有时候写成“-lsunq”。  


gcc的常用警告和出错参数 

参数含义
-ansi支持符合ANSI的c程序
-pedantic允许发出ANSI c标准所列的全部警告信息
-pendantic-error允许发出ANSI c标准所列的全部错误信息
-w关闭所有警告
-Wall允许发出gcc提供的所有有用的告警信息
-werror把所有的告警信息转化为错误信息,并在告警发生时终止编译
步骤 2:关闭所有告警
gcc  1-7.c  –o  1-7  –w
步骤 3:显示不符合ANSI c标准语法的告警信息
gcc  1-7.c  –o  1-7  –ansi
步骤 4: 允许发出ANSI c标准所列的全部警告信息
gcc  1-7.c  –o  1-7  –pedantic
步骤 5:允许发出gcc提供的所有有用的告警信息
gcc  1-7.c  –o  1-7  –Wall

优化参数

代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。

gcc提供的代码优化功能非常强大,它通过编译参数“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。

通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。

gcc  1-8.c  –o  1-8  –O2

优化虽然能够给程序带来更好的执行性能,但在一些场合中应该避免优化代码。 

  • 程序开发的时候。 
  • 资源受限的时候。 
  • 跟踪调试的时候。

gdb

Linux下的gdb调试器,是一款GNU组织开发并发布的UNIX/Linux下的程序调试工具。它没有图形化的友好界面,但功能强大。
在进行应用程序的调试之前,要注意的是gdb进行调试的是可执行文件,而不是如“.c”这样的源代码文件。因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。

gcc 1-9.c  –o  1-9 –g
gdb  1-9

常用的gdb命令

命令格式作用
list<行号>|<函数名>查看指定位置的程序源代码
break 行号|函数名<条件表达式>设置断点
info break显示断点信息
run 运行程序
print 表达式|变量查看程序运行时对应表达式和变量的值
next单步恢复程序运行,但不进入函数调用
step单步恢复程序运行,且进入函数调用
continue继续执行函数,直到函数结束或遇到新的断点

用gdb调试程序

  • 查看源文件

在gdb中输入“l”(list)就可以查看程序源代码,一次显示10行; 

  • 设置断点

在gdb中设置断点命令是“b”(break),后面跟行号或者函数名。
如:(gdb) b 10   

  • 查看断点信息

用命令“info b”(info break)查看断点信息。

注意:gdb在一个程序中可以设置多个断点,有多个断点中断时,“Num”处显示断点序号。

  • 运行程序:输入“r”(run)开始运行程序。

注意:gdb默认从第一行开始运行,如果要从程序中指定行开始运行,只需输入“r”+行号。

  • 查看变量值

程序运行到断点处会自动暂停,输入“p 变量名”.

调试程序时,可能需要修改变量值,程序运行到断点处时,输入“set 变量=设定值”,例如给变量“a2” 赋值11,输入“set a2=11”。

gdb在显示变量值时都会在对应值前加“$n”标记,它是当前变量值的引用标记,以后想再引用此变量,可以直接使用“$n”,提高了调试效率 

注意:查看变量值,不能在程序结束后。

  • 单步运行

在断点处输入 “n”(next)或者“s”(step) 。它们之间的区别在于:若有函数调用时,“s”会进入该函数而“n”不会进入该函数。

 

  • 继续运行程序

输入“c”(continue)命令恢复程序的正常运行,把剩余的程序执行完,并显示执行结果。

  • 退出gdb环境:输入“q”(quit)命令。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值