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

时间: 2024-10-12 08:17:55

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

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

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

1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 一:Vim 1.使用vim命令进入vim界面 $ vim practice_1.txt  或    $ vim 2.游标移动 按键 说明 h 左 l 右(小写L) j 下 k 上 w 移动到下一个单词 b 移动到上一个单词 3.进入插入模式 命令 说明 i

linux下的bash编程简要学习

linux下的bash编程简要学习     1.bash是什么: linux运行时系统只会运行系统运行所需要的运行脚本即系统守护进程,一般根据用户自己需求设定和实现的服务需要手动启动,这种服务进程通常由bash启动,脚本中的命令通常被按照一定规则被bash读取视作参数,因此在脚本头部要申明运行的bash类型,bash命令分为内建命令及外部命令,外部命令通过PATH进行依次查找. bash读取命令后将其启动(fork)成为一个进程,依次启动服务     2.bash控制语句:         本地

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

LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时,可以直接在main函数中包含该文件,比如一个文件夹下包含add.c和main.c文件: 方法一: 文件add.c定义两个整数相加的函数,code如下: #include <stdio.h> #include <math.h> int add(int a,int b) { int z;

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

做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目.今天学了2点,一个是库文件处理,另一个是makefile编写. 学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西. gcc的编译过程 首先需要清楚gcc编译做了些什么 源文件

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

C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:include<stdio.h>和include"stdio.h" 前者(使用<>),来引用stdio.h文件,是首先检索标准路径,看看这些文件夹下是否有该头文件:如果没有,也不会检索当前文件所在路径,并将报错. 后者(使用""),来引用stdio.h文

__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )

[email protected]:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H        #define GLOBAL_H        #include <stdio.h>        int funca(void);        int funcb(void);#endif[email protected]:~/cpropram/2# cat funca.c //函数a#include "global.h"i

linux下C语言编程动态库so的编写及调用

//test_so.h #include <stdio.h> void test_a(); void test_b(); //test_a.c #include "so_test.h" void test_a() { printf("this is in test_a...\n"); } //test_b.c #include "so_test.h" void test_b() { printf("this is in te

linux 操作系统下c语言编程入门

2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编