一、目的:

1、 练习并掌握Linux提供的vi编辑器来编译C程序

2、 学会利用gcc、gdb编译、调试C程序

3、 学会使用make工具

二、内容

1、 编写C语言程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。

2、 利用gdb调试程序。

3、 学习编写makefile,并进行编译。

三、操作

1、文件编辑器vi

进入vi,直接执行vi编辑程序。

例:# vi test.c

显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。编辑完成后,使用者可决定是否要取代原来旧有的文件。

1) vi的工作模式

(1)输入模式

输入以下命令即可进入vi输入模式:

a

在光标之后加入资料

A

在该行之末加入资料

i

在光标之前加入资料

I

在该行之首加入资料

o

新增一行于该行之下

O

新增一行于该行之上

(2)命令模式

在输入模式下,按ESC可切换到命令模式。命令模式下,可选用下列指令离开vi:

:q!

离开vi,并放弃刚在缓冲区内编辑的内容

:wq

将缓冲区内的资料写入磁盘中,并离开vi

ZZ

同wq

:x

同wq

:w

将缓冲区内的资料写入磁盘中,但并不离开vi

:q

离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用

(3)命令模式下光标的移动

h

左移一个字符

j

下移一个字符

k

上移一个字符

l

右移一个字符

0(零)

移至该行的行首

$

移至该行的行尾

^

移至该行的第一个字符处

H

移至窗口的第一行

M

移至窗口中间那一行

L

移至窗口的最后一行

G

移至该文件的最后一行

W, w

下一个单词 (W 忽略符号)

B, b

上一个单词 (B 忽略符号)

(4) 命令模式下的编辑命令

dd

删除当前光标所在行

yy

复制当前光标所在行

p

将复制的内容粘贴在光标所在的位置后

P

将复制的内容粘贴在光标所在的位置前

x

删除当前光标字符

X

删除当前光标之前字符

u

撤消

·

重做

2、GNU C编译器

1) 使用gcc

通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下:

gcc [options] [filenames]

命令行选项指定的编译过程中的具体操作

2) gcc常用选项

当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。

选项含义:

-o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没

有指定,默认文件名是a.out.

例如,

# gcc test.c

编译成功后,当前目录下就产生了一个a.out文件。

也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。

例如:

#gcc  –o count count.c

此时得到的可执行文件就不再是a.out,而是count。

-c GCC 仅把源代码编译为目标代码。默认时GCC 建立的目标代码文件有一个.o 的

扩展名。

-E 对文件进行预处理

-S 对文件进行编译,生成汇编代码。

-O 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。

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

-Wall 允许发出GCC 能提供的所有有用的警告,也可以用-W(warning)来标识指定的

警告。

-l name 链接静态库

-L dir 库文件的搜索路径

3) 执行文件

格式: ./可执行文件名

例:

# ./a.out

# ./count

4) 例子

mypow.c:定义mypow()函数

unsigned long long mypow(unsigned int x, unsigned int y)

{

unsigned long long res=1;

if (y==0)

res = 1;

else if (y==1)

res = x;

else

res

= x * mypow(x, y-1);

return res;

}

powtest.c:调用mypow()函数

#include

#include

int main(int argc, char *argv[])

{

unsigned int x, y;

unsigned long long res;

if ((argc<3) || (sscanf(argv[1], "%u", &x)) != 1 ||

(sscanf(argv[2], "%u", &y)) != 1 )

{

printf("Usage:pow base exponent\n");

exit(1);

}

res = mypow(x, y);

printf("%u ^ %u = %u\n", x, y, res);

return 0;

}

编译过程:

# gcc -c mypow.c

# ar rcsv libpow.a mypow.o

a - mypow.o

# gcc -o powtest powtest.c -L. -lpow

# ./powtest

Usage:pow base exponent

# ./powtest 2 10

2 ^ 10 = 1024

3、gdb调试工具

1) 调试编译代码

为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。

在编译时用 –g 选项打开调试选项。

2) gdb基本命令

命 令

描 述

file

装入欲调试的可执行文件

kill

终止正在调试的程序

list

列出产生执行文件的源代码部分

next

执行一行源代码但不进入函数内部

step

执行一行源代码并进入函数内部

run

执行当前被调试的程序

quit

终止gdb

watch

监视一个变量的值而不管它何时被改变

break

在代码里设置断点,使程序执行到这里时被挂起

make

不退出gdb就可以重新产生可执行文件

shell

不离开gdb就执行UNIX shell 命令

3) 调试程序

(1) 源程序gdbtest1.c,分析程序的功能,如果出错,要求用gdb进行调试并给出修改方案。

基本步骤:

¨ 编译:gcc -g -o gdbtest1 gdbtest1.c

¨ 运行:./gdbtest1

¨ 开始调试:gdb gdbtest1

#include

int add_range(int low, int high)

{

static int i,sum;

for(i=low; i<=high; i++)

sum = sum +i;

return sum;

}

int main(void)

{

int result[100];

result[0] = add_range(1,10);

result[1] = add_range(1,100);

printf("result[0]=%d\nresult[1]=%d\n",result[0],result[1]);

return 0;

}

(2)

源程序greet.c,功能:按照正序和逆序输出给定的字符串。要求用gdb进行调试,,分析出错的原因并给出修改方案。

#include

#include

#include

void my_print (char *string);

void my_print2 (char *string);

int main()

{

char my_string[] = "hello there";

my_print (my_string);

my_print2 (my_string);

return 0;

}

void my_print (char *string)

{

printf ("The string is %s\n", string);

}

void my_print2 (char *string)

{

char *string2;

int size, i;

size = strlen (string);

string2 = (char *) malloc (size + 1);

for (i = 0; i < size; i++)

string2[size - i] = string[i];

string2[size + 2] = '\0';

printf ("The string printed backward is

%s\n", string2);

}

4、make的使用

(1)用vi编辑以下程序,程序清单:

main.c

function1.h

function1.c

function2.h

function2.c

//main.c

#include "function1.h"

#include "function2.h"

int main(int argc, char **argv)

{

function1_print("hello");

function2_print("world");

return 0;

}

//function1.h

void function1_print(char *str);

//function1.c

#include "function1.h"

void function1_print(char *str)

{

printf("This is function1 print %s\n", str);

}

//function2.h

void function2_print(char *str);

//function2.c

#include "function2.h"

void function2_print(char *str)

{

printf("This is function2 print %s\n", str);

}

实验要求:

(1)画出各个源程序、目标文件以及最终的目标文件之间的依赖关系图。

(2)编辑makefile文件

(3)利用make命令进行上述程序的编译,生成可执行代码并运行。

(4)修改其中一个源文件,重新make,察看编译过程。

(5)通过使用makefile变量和隐含规则,对makefile文件进行简化

四.试验总结

写出详细的试验过程及其试验结果。

linux运行c语言实验总结,实验三:LINUX 下C语言使用、编译与调试实验相关推荐

  1. linux运行go程序命令行,宝塔面板Linux环境-安装Golang:Go语言环境安装以及程序如何运行...

    有的人可能对Go语言很感兴趣,这也是近几年很火的一门编程语言,我们可以在宝塔面板Linux环境下安装Go语言环境. 安装环境:CentOS Linux 7.6.宝塔面板6.9.3.golang:go1 ...

  2. linux 运行安卓游戏吗,桌面应用|在 Linux 上安装安卓 8.1 Oreo 来运行应用程序和游戏...

    android x86 是一个自由而开源的项目,将谷歌制作的安卓系统从 ARM 架构移植到了 x86 架构,可以让用户在他们的桌面电脑上运行安卓系统来享受所有的安卓功能和应用程序及游戏. 在前一段时间 ...

  3. linux运行驱动的命令,「驭龙」Linux执行命令监控驱动实现解析

    本文是「驭龙」系列的第三篇文章,对照代码解析了驭龙在Linux执行命令监控驱动这块的实现方式.在正式宣布驭龙项目开源之前,YSRC已经发了一篇关于驭龙EventLog 读取模块迭代历程的文章. 0x0 ...

  4. 数电实验报告实验一_大二下学期的两三事之数电实验amp;课设

    数电实验&课设 叮 写在前面 这学期的数电实验老师是陈W老师.上学期的模电,选过一次他的课,线下教学,老师讲课游刃自如,点到为止,但又醍醐灌顶:这学期线上教学,可能是软件运用不熟练,他多少有些 ...

  5. linux运行脚本文件python,Python脚本:Linux自动化执行Python脚本

    1.环境及其工具: ubuntu 16.04 python2.7(自带) pip2.7(安装) virtualenv(安装) crontab (自带) 2.pip2.7安装 (1)尝试使用 sudo ...

  6. vs qt 在linux运行,QT安装以及使用(QT支持linux和windows,也支持C/C++代码的编译运行,比vs简洁多)...

    Windows:linux 0. QT Version qt-win-opensource-4.7.4-mingw qt-creator-win-opensource-2.4.1 1. 系统 Wind ...

  7. linux运行大端程序,ARM 平台上的Linux系统启动流程

    开始学习嵌入式开发就一直在使用Linux系统作为学习的平台,到现在无论是PC机还是ARM开发板都已经能顺利地跑起了Linux系统,但是对Linux 的启动流程还是不甚了解.于是开始各种百度谷歌,当然看 ...

  8. staf linux运行模式,【转】windows和linux下安装STAF

    1.       安装包下载 从http://staf.sourceforge.net/getcurrent.php 下载所需安装包,有Windows.Linux.Solaris.Mac等不同平台不同 ...

  9. linux运行激战2,在Deepin 20.1系统下可用Wine来模拟运行激战2游戏

    经过实测并确定,在Deepin 20.1系统下可以用Wine来模拟运行激战2网络游戏,它的表现跟Windows下差不多,虽然是Wine,但这个游戏优化还是挺好的,我是核显玩的,帧数大概30左右吧,效果 ...

最新文章

  1. 22张精炼图笔记,深度学习专项学习必备
  2. 实验 7 场景运行监控及性能测试结果分析_实验报告--软件功能测试与性能测试实验
  3. 理解依赖注入(IOC)和学习Unity
  4. 开源短地址_如何在短短5分钟内完成您的第一个开源贡献
  5. 一张图理清 Python3 所有知识点
  6. Anbox之push_locked与pop_locked(十三)
  7. php url编码解码
  8. pyspark调用spark以及执行带in语句参数的hql示例
  9. SpringBoot2.4.2+Vue集成Activiti6流程引擎
  10. (实用)网页在线QQ客服咨询html代码
  11. termux搭建局域网web服务器
  12. 服务器开机风扇转但无显示,电脑开机主机风扇在转,显示器却显示无信号是怎么回事?...
  13. write combining
  14. Context-Aware Zero-Shot Recognition 论文翻译
  15. mysql 管理instance_MySQL从零开始——第三章 MySQL体系结构
  16. 涠洲岛日出日落时间表,1月10日涠洲岛开船时间/日出日落/天气预报
  17. Java继承的综合案例——群主发红包
  18. 吉林大学[离散数学(68集)AVI] 下载地址 百度云盘
  19. 百度云非 VIP如何作弊加速?
  20. 在线计算机推理,UCAT考试——定量推理部分指南

热门文章

  1. Oracle 9i 10g 迅雷可以直接下载
  2. 无盘网吧服务器入侵,无盘网吧局域网病毒清除全过程
  3. Edge浏览器黑色背景设置
  4. openbmc开发23:添加fru信息到ipmi
  5. FLAX Engine
  6. 计算机跟设备维修都有什么,设备维护
  7. 2009吴克群深圳演唱会
  8. 定义html表格的大小和位置,点晴OA工作流表单设计:表格table及宏控件的HTML、CSS、字体参数教程详解...
  9. linux下载中文输入合法_7个下载免费音乐的最佳地点(合法)
  10. linux删除文件text命令行,使用 Linux 文件恢复工具