• Linux下C语言编程基础学习记录


    VIM的基本使用 

    LINUX下C语言编程

    1. 用gcc命令编译运行C语言文件

    1. 预处理阶段:将*.c文件转化为*.i预处理过的C程序。

    2. 编译阶段:将*.i文件编译为汇编代码*.s文件。

    3. 汇编阶段:将*.s文件转化为*.o的二进制目标代码文件。

    4. 链接阶段:将*.o文件转化为可执行文件。

    5. 生成可执行文件:将*.o转换为可执行文件。

    6. 执行可执行C语言文件。

    7. gcc常用选项列表

      -c      只编译不链接,生成目标文件“.o”

      -S      只编译不汇编,生成编码代码

      -E      只进行预编译,不做其他处理

      -g      在可执行程序中包含标准调试信息

      -o file   将file文件指定为输出文件

      -v      打印出编译器内部编译各过程的命令行信息和编译器的版本

      -I dir    在头文件的搜索路径中添加dir目录

      直接生成可执行文件

      例:gcc –o hello hello.c

             gcc –g –o p main.c  swap.c (p为可执行文件)

    1. 静态库的创建

      使用归档工具ar将一些目标文件集成在一起。

       

      静态库的使用

      编译主程序,它将会链接到刚生成的静态库libpow.a中

       

      例2:

      使用 AR工具创建静态库(课本p459)

      gcc –c addvec.c multvec.c

      ar  rcs  libvector.a  addvec.o  multvec.o

      创建可执行文件并执行

       

      注意:创建头文件的格式:

      //若头文件名为headrt.h

      #ifndef HEADRT_H

      #define HEADRT_H

      内容...

      #endif

    2. gcc的警告和出错选项

    选项

    含义

    -ansi

    支持符合ANSI标准的C程序

    -pedantic

    允许发出ANSI C标准所列的全部警告信息

    -pedantic-error

    允许发出ANSI C标准所列的全部错误信息

    -w

    关闭所有警告

    -Wall

    允许发出gcc提供的所有有用的报警信息

    -werror

    把所有的警告信息转化为错误信息,并在警告发生时终止编译过程

     

    1. gdb调试器的使用

      gdb调试器是一款GNU开发组织发布的UNIX/Linux下的调试工具。

      使用流程

    1. 先用gcc对test.c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。

    2. 使用gdb调试文件

       

    3. 在gdb中键入“l”(list)就可以查看所载入的文件,如下所示。

      注意:在gdb的命令中都可以使用缩略形式的命令,如“l”代表“list”,“b”代表“breakpoint”,“p”代表“print”等,读者使用“help”命令查看帮助信息。

    4. 设置断点

      只需在“b”后加入对应的行号即可。

      查看断点情况

      在设置完断点之后,用户可以键入“info b”来查看设置断点情况,在gdb中可以设置多个断点。

       

      用户键入“backrace”(只输入“bt”即可)可以查到调用函数(堆栈)的情况。

    5. 运行代码

      gdb默认从首行开始运行代码,键入“r“(run)即可(若想从程序中指定行开始运行,可在后面加上行号)。

       


    (6) 查看变量值。

    在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在gdb中键入“p”+变量值即可。

     

    (7)单步运行。

    单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别在于:若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。

    (8)恢复程序运行。

         在查看完所需变量及堆栈情况后,就可以使用命令“c“恢复程序的正常运行了。

         这时它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。

    (9)在gdb中可以使用help查看帮助。

    (10)工作环境相关命令

            

    命令格式

    含义

    set args 运行时的参数

    指定运行时参数,如set args 2

    show args

    查看设置好的运行参数

    path dir

    设定程序的运行路径

    show paths

    查看程序的运行路径

    set environment var [=value]

    设置环境变量

    show environment [var]

    查看环境变量

    cd dir

    进入dir目录,相当于shell中的cd命令

    pwd

    显示当前工作目录

    shell command

    运行shell中的command命令

    (11)设置断点与恢复命令

    命令格式

    含义

    Info b

    查看所设断点

    break[文件名:]行号或函数名<条件表达式>

    设置断点

    tbreak[文件名:]行号或函数名<条件表达式>

    设置临时断点,到达后自动删除

    delete[断点号]

    删除指定断点,其断点号为“info b“中的第一栏。若默认断点号则删除所有断点

    disable[断点号]

    停止指定断点,使用“info b“仍能查看此断点。同delete一样,若默认则停止所有断点

    enable[断点号]

    激活指定断点,即激活被disable停止的断点

    condition[断点号]<条件表达式>

    修改对应断点的条件

    ignore[断点号]<num>

    在程序执行中,忽略对应断点num

    Step

    单步恢复程序运行,且进入函数调用

    Next

    单步恢复程序运行,且不进入函数调用

    Finish

    运行程序,直到当前函数完成返回

    C

    继续执行函数,直到函数结束或遇到新的断点

    (12)gdb中源码查看相关命令

    命令格式

    含义

    list<行号>|<函数名>

    查看指定位置代码

    file[文件名]

    加载指定文件

    forward-search 正则表达式

    源代码的前向搜索

    reverse-search 正则表达式

    源代码的后向搜索

    dir DIR

    将路径DIR添加到源文件搜索的路径的开头

    show directories

    显示源文件的当前搜索路径

    info line

    显示加载到gdb内存中的代码

    (13)gdb中查看运行数据相关命令

    命令格式

    含义

    print 表达式|变量

    查看程序运行时对应表达式和变量的值

    x<n/f/u>

    查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字节数

    display 表达式

    设定在单步运行或其他情况中,自动显示的对应表达式的内容

    backtrace

    查看当前栈的情况,即可以查到哪些被调用的函数尚未返回

    (14)gdb中修改运行参数相关命令

    gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set  var 变量=设定值“。这样,在此之后,程序就会按照该设定的值运行了,或者是使用print命令修改。

    例:“print key=value”

     

    1. make工程管理器

      makefile是make读入的唯一配置文件

      在一个makefile中通常包含如下内容:

    1. 需要由make工具创建的目标体(target),通常是目标文件或可执行文件。

    2. 要创建的目标体所依赖的文件(dependency_file);

    3. 创建每个目标体时需要运行的命令(command),这一行必须以制表符(Tab键)开头。

      格式:

      target: dependency_files

                    command

      例:makefile内容如下

       

      命令行中执行的命令:

       

      生成目标文件hello.o

      makefile中常见得预定义变量

       

      makefile中常见的自动变量

       

      makefile中常见的隐式规则目录

      make的命令行

    命令格式

    含义

    -C dir

    读入指定目录下的makefile

    -f file

    读入当前目录下的file文件作为makefile

    -i

    忽略所有的命令执行错误

    -I dir

    指定被包含的makefile所有目录

    -n

    只打印要执行的命令,但不执行这些命令

    -p

    显示make变量数据库和隐含规则

    -s

    在执行命令时不显示命令

    -w

    如果make在执行过程中改变目录,则打印当前目录名

        1. 动态链接共享库

          共享库是致力于解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行时,可以加载到任意的存储器地址,并和一个存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接器的程序来执行。

          共享库也称为共享目标,在Unix系统中通常用.so后缀来表示。微软的操作系统大量地利用了共享库,它们称为DLL(动态链接库)。

          创建共享库

          链接到程序中

           

              

    作业

    将实验楼中的代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so;

    编写makefile,让代码编译,上述静态库和共享库的使用自动化

     

    建立函数静态库cal1.a:

     

    将静态库cal1.a链接到main.o中并生成执行文件cal1并执行

     

     

    建立函数动态库cal2.so

    将静态库cal2.a链接到main.o中并生成执行文件cal2并执行

    建立静态库的makefile文件

     

    运行make管理器生成cal3执行文件并执行

     

    建立动态库makefile文件

     

    运行make管理器生成cal4执行文件并执行

     

    遇到的问题

    在gdb中执行单步调试中使用set修改变量值时出现如下提示,修改失败。

    解决方法

    向老师请教

    教材有错,正确的格式应为:

    set var  变量名=修改值

    print  变量名=修改值

  • 相关阅读:
    VTemplate模板引擎的使用--入门篇
    VTemplate模板引擎的使用--进阶篇
    装载当前页面的模板文档
    学习平台判断是否是手机端
    畜禽免疫系统使用LODOP打印
    关于.NET编译的目标平台(AnyCPU,x86,x64)(转)
    ConcurrentHashMap原理分析(1.7与1.8)
    Synchronized方法锁、对象锁、类锁区别
    谈谈线上CPU100%排查套路
    java-虚拟机-索引
  • 原文地址:https://www.cnblogs.com/Ntime/p/4842085.html
Copyright © 2020-2023  润新知