• 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中“#”字符后的内容被注释掉

     

    @:取消回显

  • 相关阅读:
    php文件里直接写上<?xml version="1.0" encoding="utf8"?>出错?
    Cannot modify header information headers already sent by错误解决办法
    转:静态类和单例的区别
    转:Spring TransactionDefinition中事务传播的类型
    转:注解+动态代理例子
    转:UML几种类间关系
    转:AOP 的利器:ASM 3.0 介绍
    转:java内部类
    Android 模拟器安装及使用教程
    转:java读取指定package下的class
  • 原文地址:https://www.cnblogs.com/smileallen/p/3391597.html
Copyright © 2020-2023  润新知