linux GCC GDB make 编程及命令

GCC编程

linux 系统下的GCCGNU推出的功能强大、性能优越的平台编译器,是GNU的代表作之一。

GCC编译器能将CC++语言源程序、汇编程序编译、连接成可执行文件,在linux系统中,可执行文件没有后缀,系统从文件的属性来区分可执行文件和不可执行文件。

使用GCC编译程序时,编译过程可以分为四个阶段:

 *预处理(pre-processing

*编译(compiling)

*汇编(assembling)

*连接(lingking)

GCC通过后缀来区别输入文件的类别:

*.c ------- C语言源代码文件

*.a-------:   是由目标文件构成的库文件

*.C,.cc.cxx-----:  C++元代码文件

*.h------:    头文件

*.i------:  是已经与处理过的C源代码文件

*.ii----- 是已经处理过的C++源代码文件

*.o-----:   是编译后的目标文件

*.s-----:   是汇编语言源代码文件

*.S----:   是经过预编译的汇编语言文件源代码

基本用法

gcc最基本的用法是::

       gcc [options] filename

options  编译器所需要的编辑选项

filename 要编译的文件名

 

 

gcc编译器中最常用的参数有

* -o output_filename :  确定可执行文件的名称为output_filename.如果不给出这个选项,gcc就给出预设的可执行文件a.out

* -c :  只编译,不连接成为可执行的文件,编译器只是由输入的.c等源代码文件生成。o为后缀的目标文件。

*-g :产生调试工具(GNUgdb)所必须的符号信息,要相对编译出的程序进行调试,就必须加入这个.3选项。

*-o : 对程序进行优化编译、连接,采用这个选项,整个代码会在编译、连接过程中进行优化处理,这样产生的课执行效率可以更高,但是时间就要花费更多。

*-o2 : -o更好的优化编译、连接,当然整个编译、连接过程会更慢。

 

 

例程:optimize.c

 

 

 

 

输入:gcc optimize.c –o optimize

     ./optimize

   即可得到运行结果,

   再运行gcc –O optimize.c –o optimize 程序性能会得到大幅度的改善。

 

 

C程序中头文件包含两种情况:

 #include

#include”B.h”

    对于<> 预处理程序cpp在系统预设的头文件目录中搜寻文件;

   对于“” cpp在当前目录中搜寻头文件,若在当前目录中没有找到需要的头文件,则 就到指定的dirname中去寻找。

Idirname:dirname所指的目录加入到程序头文件目录列表中,

例:::

    gcc foo.c –I/home/include –o foo

Ldirname :  dirname所指出的目录加入到库文件的目录列表中。在默认的状态下,连接程序ld在系统的预设路径中需找需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再找到系统预设的路径中寻找。

-Wall : 生成所有警告信息

-w :   不生成任何告警信息。

-DMACRO  定义MACRO宏,等效于程序中使用#define MACRO

GDB调试

GDBGNU发布的一款功能强大的程序调试工具。主要功能:

1、    启动被调试程序。

2、    让被调试的程序在指定的位置停住。

3、    当程序被停住时,可以检查程序状态,如 变量值

   调试要生成调试文件所以在编译时所用命令:

     编译生成可执行文件:

           gcc –g tst.c –o tst

     启动GDB

           gdb tst

     main函数出设置断点

           break  main    (或者 b main

运行程序:

       run

输入 next  单步调试

输入continue 连续执行到最后。

 

 

GDB命令

l      listl  --------------------查看程序,以便增加断点

l      breakb 函数名---------在函数入口处添加断点

l      breakb 行号------------在指定行添加断点

l      breakb 文件名:行号在指定文件指定行添加断点

l      breakb 行号if条件----当条件为真时,指定行号处断点生效,

              例: b 5 if i=10   即当i=10 时第五行断点生效

l      info break ---------查看所有设置的断点

l      delete 断点编号----删除断点

l      runr-----------开始运行程序

l      nextn---------单步运行程序(不进入子函数)

l      steps----------单步运行程序 (进入子程序)

l      continuec-----继续运行程序

l      printP)变量名----查看指定变量值

l      finish ---------------运行程序 

l      watch 变量名-----对指定变量进行监控

l      quitq----------退出gdb 调试

GNU make

Linux 程序员 必须学会使用GNU make来构建和管理自己的软件工程。GNUmake能够使整个软件工程的编译、连接只需要一个命令就可以完成

makefile

make 在执行时,需要一个命令为makefile的文件。makefile文件描述了整个工程的编译,连接等规则。其中包括:工程中的那些源文件需要编译以及如何编译,需要创建那些库文件以及如何创建,如何产生最后我们想要的可执行文件。

makefile(术语)

规则:用于说明如何生成一个或多个目标文件,(规则灰常重要)

   规则格式:::

targets:prerequisites

command

        目标:依赖

           命令

例:main.o:main.c

              gcc –c main.c

*****命令需要以tab键开始*******

 makefile中,规则的顺序是很重要的,因为,makefile中只应该有一个最终目标,其他的目标都是被这个目标连带出来的,所以一定要让makefile知道你的最终目标是神马, 一般来说,定义在makefile中的目标可能会有很多,但是第一条规则中的目标被却定位最终目标

make命令默认在当前目录下寻找名字为makefile或者makefile的工程文件,当名字部位这两者之一时,可以使用如下方法指定:

        make –f 文件名  

伪目标:

Makefile  把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets

例:

   .PHONY:clean

   clean:

       rm –f hello main.o func1.o func2.o

.PHONY”将“clean”目标声明为伪目标

变量

hello:main.o func1.o func2.o

gcc main.o func1.o func2.o –o hello

思考::若要为hello目标添加一个依赖,如:func3.o ,该如何修改

答案1

 hello:main.o func1.o func2.o func3.o

gcc main.o func1.o func2.o  func3.o –o hello

答案2::

   obi=main.o func1.o func2.o func3.o

   hello:$(obj)

       gcc $(obj) –o hello

makefile中,存在系统默认的自动化变量

*$^---------代表所有的依赖文件

*$@-------代表目标

*$<--------代表第一个依赖文件

makefile中“#”字符后的内容被注释掉

 

@:取消回显

原文地址:https://www.cnblogs.com/smileallen/p/3391597.html