Linux下C语言开发基础实验内容

目录

1、Linux下C语言开发流程

2、vi,vim编辑器的使用

3、Gcc编译器的使用

总体选项:

警告选项:

4、GDB 基本命令的使用

5、Make 工程管理器的使用


1、Linux下C语言开发流程

(1)启动虚拟机,进入Linux操作系统,然后启动终端。

(2)使用Vim 编辑源程序,在终端中输入vi hello.c,然后输入源代码,编辑完成后存盘。

(3)编译源代码,在终端下输入gcc hello.c–o hello进行编译。

(4)运行程序,在终端中查看程序运行结果

#include<stdio.h>
void main()
{printf("I am a haoren\n");
}

在终端输入" gcc hello.c -o hello",编译完成后,输入"./hello"

效果图如下

2、vi,vim编辑器的使用

(1)Vim 的启动。

(2)三种模式:命令模式、编辑模式、底行模式之间的切换,以及三种模式下的常用命令的使用。参考教材中命令行模式和底行模式下的常见功能键完成如下操作练习。

Ø 在“/root”目录下建一个名为“Vi”的目录。mkdir /tmp/Vi

Ø 进入“Vi”目录。cd /tmp/Vi

Ø 将文件“/etc/inittab”复制到“/Vi”目录下。cp /etc/inittab ./    ;有些Linux系统中可能没有inittab文件,可以先cd /etc进入etc目录,输入命令“ls -l” 查看自己是否具有inittab,若没有,可以用其他文件代替,也可以自己创建一个文件。

Ø 使用Vi 打开“Vi”目录下的inittab。

Ø 设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。:set nu

Ø 将光标移到该行。17<enter>

Ø 复制该行内容。yy

Ø 将光标移到最后一行行首。G

Ø 粘贴复制行的内容。p

Ø 撤销第9 步的动作。u

Ø 将光标移动到最后一行的行尾。$

Ø 粘贴复制行的内容。p

Ø 光标移到“si::sysinit:/etc/rc.d/rc.sysinit”。21G

Ø 删除该行。dd

Ø 存盘但不退出。:w(底行模式)

Ø 将光标移到首行。1G

Ø 插入模式下输入“Hello,this is Vi world!”。按i 键并输入“Hello,this is Vi world!”(插

入模式)

Ø 返回命令行模式。Esc

Ø 向下查找字符串“0:wait”。/0:wait(命令行模式)

Ø 再向上查找字符串“halt”。?halt

Ø 强制退出Vi,不存盘。:q!(底行模式)

3、Gcc编译器的使用

参考教材中gcc的命令和编译选项,构造实验测试总体选项、警告和出错选项以及优化选项的编译。效果。

总体选项:

首先在一个“srv”目录中创建一个.c文件(qwe.c),然后用vi进入qwe.c进行编辑,代码如下:

#include<stdio.h>
void main()
{printf("I am a student!\n");
}

预处理阶段:gcc -E qwe.c -o qwe.i

编译阶段:gcc -S qwe.i -0 qwe.s

汇编阶段:gcc -c qwe.s -o qwe.o

链接阶段:gcc qwe.o -o qwe

效果如下:

警告选项:

判断你的代码是否有问题的一个重要的指标,可以让你的代码越来越完美,成为一个越来越优秀的工程师。

以这个代码为例:

#include<stdio.h>
void main(void)
{
long long tmp = 1;
printf("This is a bad code!\n");
}

1. Wall类警告提示

这一类警告提示选项占了GCC警告选项的90%以上,它不仅包含打开所有警告等功能,还可以单独对常见错误分别指定警告。

在命令行输入以下代码:

root@ubuntu:/srv#  gcc -Wall wrong.c -o wrong

wrong.c:4:warning:return type of'main'is not'int'

wrong.c:In function'main':

wrong.c:5:warning:unused variable'tmp'

从这里可以看出:使用”-Wall”选项找出了未使用的变量tmp以及返回值的问题,但没有找出无效数据类型的错误

2. 非Wall类警告提示

非Wall类的警告提示中最为常用的有以下两种:“-ansi”“-pedantic”

(1)“-ansi”

该选项强制GCC生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSIC标准的。

在命令行输入以下代码:

root@ubuntu:/srv# gcc -ansi wrong.c -o wrong

wrong.c:In function'main':

wrong.c:4:warning:return type of'main'is not'int'

从这里可以看出:该选项并没有发现“long long”这个无效数据类型的错误。

(2)“-pedantic”

该选项允许发出ANSIC标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSIC标准的。

在命令行输入以下代码:

root@ubuntu:/srv# gcc -pedantic wrong.c -o wrong

wrong.c:In function'main':

wrong.c:5:warning:ISO C90 does not support'long long'

wrong.c:4:warning:return type of'main'is not'int'

从这里可以看出:使用该选项查看出了“long long”这个无效数据类型的错误。

4、GDB 基本命令的使用

gdb 所提供的功能,使用Vim 编辑源程序,在终端中输入vi test.c,输入如下源代码,编辑完成后存盘。此代码的功能为输出倒序main 函数中定义的字符串,但结果没有输出显示,现通过调试的方式来解决程序中存在的问题。

例子:未调试的源代码如下

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int display1 (char *string);
int display2 (char *string1);
int main ()
{
char string[] = "Embedded Linux";
display1 (string);
display2 (string);
}
int display1 (char *string)
{
printf ("The original string is %s \n", string);
}
int display2 (char *string1)
{
char *string2;
int size,i;
size = strlen (string1);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string1[i];
string2[size+1] = ' ';
printf("The string afterward is %s\n",string2);
}

(1)用Gcc 编译:gcc -g greet.c -o greet

(2)运行greet:./greet,输出为:

The original string is Embedded Linux

The string afterward is

可见,该程序没有能够倒序输出。

(3)启动Gdb 调试:gdb greet

<1>查看源代码:l

<2>在21 行(for 循环处)设置断点:b 21 ;for循环在哪一行断点设置在哪一行

<3>在24 行(printf 函数处)设置断点:b 24。

<4>查看断点设置情况:info b

<5>运行代码:r

<6>单步运行代码:n

<7>查看暂停点变量值:p string2[size - i]

<8>继续单步运行代码数次,并使用命令查看,发现string2[size-1]的值正确

<9>继续程序的运行:c

<10>程序在printf 前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31 行,发现程序运行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。

<11>退出Gdb:q

<12>重新编辑greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] =string1[i];”即可。使用Gcc 重新编译,查看运行结果:./greet

The original string is Embedded Linux

The string afterward is xuniL deddedbmE

这时,输入结果正确。

5、Make 工程管理器的使用

(1)编辑源代码,利用文本编辑器vi在“media”目录下创建hello5.c 文件,vi hello5.c

#include <stdio.h>
int main()
{
printf("Welcome Emdoor!\n");
return 1;
}

(2)编写makefile文件,利用文本编辑器创建一个makefile文件,并将其保存到与hello5.c 相同的目录下(一定要在相同的目录下

CC=gcc
CFLAGS=
all: hello
hello:hello.o$(CC) $(CFLAGS) hello.o –o hello
hello.o:hello.c$(CC) $(CFLAGS) –c hello.c –o hello.o
clean:

(3)执行make,查看并记录所生成的文件和运行的结果。

各位观众老爷点个赞!!!

关于Linux下C语言开发基础的实验内容。相关推荐

  1. GCC编译器简明教程(Linux下C语言开发环境的搭建)

    GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...

  2. Linux下C语言开发(信号signal处理机制)

    信号signal处理是Linux程序的一个特色,用信号处理来模拟操作系统的中断功能,对于系统程序员来说是最好的一个选择了.同样信号处理也是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概 ...

  3. 手把手教你Linux下基于ITK开发基础(1)

    手把手教你Linux下基于ITK开发基础(1) *requirement: requirement version git 2.17.1 g++ Ubuntu 7.5.0-3 ubuntu1~18.0 ...

  4. linux中命令对c文件进行编译,Linux下C语言编译基础及makefile的编写

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在L ...

  5. c语言进程waitpid,Linux下C语言开发(进程控制编程——wait()、waitpid())

    wait()和wait()函数说明 wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或该进程接收到一个指定的信号为止.如果该父进程没有子进程或它的子进程已经结束,则 ...

  6. Linux环境C语言开发基础

    C语言是一门面向过程的计算机编程语言,与C++.C#.Java等面向对象编程语言有所不同.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.仅产生少量的机器码以及不需要任何运行环境支持便能 ...

  7. Linux下C语言实现多线程排序文件内容

    一.要求及主要函数 使用多线程,编写一个并行程序,将目录中的多个文件里的内容进行排序. 文件内容格式为: <数字><空格><数字> 例如: 0 1 2 3 4 5 ...

  8. linux+下c语言编程项目,精通UNIX下C语言编程与项目实践

    cc -I  //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编译 ...

  9. Linux下C语言编程

    第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...

最新文章

  1. final/override控制
  2. semaphore 的原理与实现
  3. 多线程编程的一点小心得(1)
  4. search-guard 在 Elasticsearch 2.3 上的运用
  5. 读书 | 数字化转型的道与术(上)
  6. 阿里云异构计算产品是如何保障双11业务的
  7. springboot 通过url访问本地文件
  8. Java JSON库Jackson 2 x新变化一览
  9. controller属于哪一层_从数字一到十,在人们心中哪一个数字最为吉利?有什么原因?...
  10. Python: subprocess.Popen()不支持unicode问题解决
  11. java 根号_没见过的 Java 入门教程之三!例程使用中文标识符代码:各种变量
  12. LOCK - 明确地锁定一个表
  13. ”三不跳“ - 再说跳槽
  14. Nacos教程_1 简介和安装
  15. 重振pointnet++雄风!PointNeXt: Revisiting PointNet++ with ImprovedTraining and Scaling Strategies
  16. Steam帐号被盗怎么办
  17. 揭秘北京龙泉寺,连清华北大学子都排队出家的神秘科研组织
  18. 【FXCG】美联储政策上升不确定 美元指数波动加大
  19. html后续及css
  20. 共享软件开发者、独立软件开发者

热门文章

  1. 数据挖掘项目——新零售无人智能售货机商务数据分析
  2. 台式计算机电源风扇不转,台式电脑风扇不转了怎么解决?台式电脑风扇不转的原因?...
  3. 安装vue@4出现报错ERR! code EEXIST npm ERR! path C:\Users\beaty-Ida\AppData\Roaming\npm\node_modules\@vue\c
  4. Oracle Primavera P6软件建立项目进度控制体系
  5. HTTP 参数类型简介
  6. SAP成本核算表中基值的理解
  7. wps打开时服务器不能响应,我的WPS不能启动了,双击打不开
  8. uni-app开发常用点
  9. 前端开发者不得不知的ES6十大特性
  10. sklearn.feature_selection.VarianceThreshold 方差过滤踩过的坑