Linux编译和调试

gcc编译器

名称:GNU Compiler Collection

对C/C++编译的控制

  • 预处理 Pre-Processing   生成 .i 文件   gcc -E -o hello.i hello.c
  • 编译 Compiling               生成 .s 文件  gcc -S -o hello.s hello.i
  • 汇编 Assembling            生成 .o 文件  gcc -c -o hello.o hello.s
  • 链接 Linking                                         gcc -o hello hello.o

gcc提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。gcc通过文件后缀名来区别输入文件的类别.
gcc常用选项及常见的文件格式,扩展名_

GCC常用参数选项
选项含义
-o filename指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果filename没有指定,缺省文件名是a.out
 
-c只编译不链接,生成目标文件.o 
-S只编译不汇编,生成汇编代码
-E只进行预编译
-Wall在发生警告时取消编译操作,即将警告看作是错误
-w禁止所有的报警
-g

在生成的可执行程序中包含标准调试信息

-v

查看gcc编译器的版本,显示gcc执行时的详细过程

-O优化代码
-pedantic在使用了扩展语法的地方将产生相应的警告信息

gdb调试器

Linux下的GDB(GNU Debugger)是一个用来调试C、C++程序的功能强大的调试器,它能够在程序运行的过程中观察程序的丙部结构和内存的使用情况。程序员也可以使用gdb来跟踪程序中的错误,从而减少了程序员的工作量。

  • 设置断点
  • 单步执行程序
  • 查看程序中变量值的变化
  • 动态改变程序的执行环境
  • 分析崩溃程序产生的core文件

gdb是一个命令行方式的调试工具,它不同于我们在Windows下常见的Turbo C,VC等图形化程序开发工具。gdb的使用非常简单,只要在Linux的命令提示符下输入gdb,系统便会启动gdb。也可以在gdb后面给出文件名,直接指定想要调试的程序,gdb就会自动调用这个可执行文件进行调试。命令形式如下:

#gdb filename

为了使gdb 正常工作,必须使程序在编译的时候包含调试信息,这需要在gcc编译时加上-g或者-ggdb选项。调试信息包含了程序中的每个变量的类型和在可执行文件中的地址映射以及源代码的行号。而gdb正是利用这些信息使源代码和机器码相关联。
 linux下gdb调试方法与技巧整理_

常用命令
命令含义
file装入想要调试的可执行文件
run执行当前被调试的程序
kill

终止正在调试的程序

list列出产生执行文件的源代码
quit退出gdb
break设置断点,将程序执行到这里时被挂起
step执行一行源代码而且进入函数内部
next执行一行源代码但不进入函数内部
print打印、赋值
display设置自动显示的表达式或变量,当程序停住或在单步跟踪时,这些变量会自动显示其当前值
backtrace回溯跟踪
frame n定位到发生错误的代码段,n为backtrace命令的输出结果中的行号

make和makefile

target ... : prerequisites ...
    command
    ...
    ...

target:可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。

prerequisites :生成该target所依赖的文件和/或target

command:该target要执行的命令(任意的shell命令)

prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

声明一个变量,objects/objs等表示obj文件

例如:

objects = main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o

edit : $(objects)
    cc -o edit $(objects)

make自动推导

GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个 .o 文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。

只要make看到一个 .o 文件,它就会自动的把 .c 文件加在依赖关系中,如果make找到一个 whatever.o ,那么 whatever.c 就会是 whatever.o 的依赖文件。并且 cc -c whatever.c 也会被推导出来。

objects = main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o

edit : $(objects)
    cc -o edit $(objects)

main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h

.PHONY : clean
clean :
    rm edit $(objects)

指定特定的Makefile,你可以使用make的 -f 和 --file 参数,如: make -f Make.Linux 或 make --file Make.AIX 。

引用其它的Makefile

在Makefile使用 include 关键字可以把别的Makefile包含进来

make的工作方式

GNU的make工作时的执行步骤如下:(想来其它的make也是类似)

  1. 读入所有的Makefile。
  2. 读入被include的其它Makefile。
  3. 初始化文件中的变量。
  4. 推导隐晦规则,并分析所有规则。
  5. 为所有的目标文件创建依赖关系链。
  6. 根据依赖关系,决定哪些目标要重新生成。
  7. 执行生成命令。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值