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  变量名=修改值

Linux下C语言编程基础学习记录的更多相关文章

  1. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  2. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  3. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

  4. 实验二 Linux下C语言编程基础

    1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...

  5. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  6. LINUX下C语言编程调用函数、链接头文件以及库文件

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

  7. Linux下C语言编程中库的使用

    零.问题 1. 为什么要用到库? 2. 我要用一个库,但是,尼玛命令行上该怎么写呢?或者说库文件如何使用? 3. Linux的库在那些地方? 4. 什么是静态库,什么是动态库,二者有啥区别? 5. 常 ...

  8. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

  9. linux下C语言编程,include的默认搜索路径

    C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:incl ...

随机推荐

  1. sed 指定行范围匹配(转)

    sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文 ...

  2. BZOJ3569:DZY Loves Chinese II(线性基)

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生.   今Dzy有一魞歄图, ...

  3. 为什么Github要把代码合并请求称为pull request而不是push request?

    问题: 我的理解是:我做了一些修改,我请求把我的修改push到你的仓库,然后你review一下我的代码,如果没问题就接受请求merge,这样的话叫做push request岂不是更合适?因为这个操作是 ...

  4. Moleskine智能笔+专用本:写完随时传到手机

    http://www.totiot.com/61805.html Moleskine公司生产的速写本和速写板一直是涂鸦爱好者和速记员们的首选.该公司还联合Adobe. Livescribe. Ever ...

  5. [转]OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中

    如果你想给游戏做个截图功能,或者想把屏幕图像弄成一个纹理,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用 glReadPixels 然后 pixels 参数传进去一块内存 ...

  6. STS-创建spring配置文件

    1.创建一个bean文件 2.输入文件名applicationContext.xml 3.这里会自动显示模板文件 4.创建后,自动填充头不定义 到这里就可以发现,我们创建spring文件时,需要的配置 ...

  7. 大数据入门第二十天——scala入门(一)入门与配置

    一.概述 1.什么是scala  Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序. ...

  8. 大数据入门第十六天——流式计算之storm详解(三)集群相关进阶

    一.集群提交任务流程分析 1.集群提交操作 参考:https://www.jianshu.com/p/6783f1ec2da0 2.任务分配与启动流程 参考:https://www.cnblogs.c ...

  9. WPF Good UI

          <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.co ...

  10. 20155307《网络对抗》Web安全基础实践

    20155307<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...