Linux C语言编程基础

Linux C语言编程基础

关于openEuler的安装过程,可以参考一下我的博客https://www.cnblogs.com/pogbar/p/15334582.html

Vmtool的安装在本文最后部分

任务详情

0. 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分)

1.选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2.13,2.14任选一个)

2.建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include,bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构,提交截图(5分)

3.进行gcc相关练习(ESc, iso, -I等)提交相关截图(5分)

4.进行静态库,动态库制作和调用练习,提交相关截图(5分)

5.进行gdb相关练习,至少包含四种断点的设置,提交相关截图(10分)

6.编写makefile(5分)

除了MyOD,其他实验均在openEuler系统下完成

一、编程基础联系,以二叉树为例

使用vim编辑tree.c并编译

可以正常编译输出

二、建立项目目录

src, include,bin, lib, docs, test文件夹
bin文件夹:放程序执行目录,.exe等存放的地方;
inc文件夹:.h头文件存放的地方;
src文件夹:.c文件存放的地方;
main.c文件为工程主函数程序执行文件。
安装tree:

可以显示出tree结构

加入学号这一认证信息

三、gcc相关练习

gcc的编译流程分为四个步骤,分别为:
· 预处理(Pre-Processing)
· 编译(Compiling)
· 汇编(Assembling)
· 链接(Linking)
以hello.c为例子,在这四个步骤中可以设置选项分别生成hello.i, hello.s, hello.o以及最终的hello文件:
hello.c : 最初的源代码文件;
hello.i : 经过编译预处理的源代码;
hello.s : 汇编处理后的汇编代码;
hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。
hello / a.out : 最终的可执行文件
以tree.c文件为例
这个程序,一步到位的编译指令是:
gcc tree.c -o tree

①预处理

gcc -E tree.c -o tree.i 或 gcc -E tree.c

可以输出文件中存放着test.c经预处理之后的代码。
gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到tree.c中了。

②编译为汇编代码(Compilation)

预处理之后,可直接对生成的test.i文件编译,生成汇编代码:
gcc -S tree.i -o tree.s

gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

③汇编(Assembly)

对于上一小节中生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:
gcc -c tree.s -o tree.o

④连接(Linking)

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
对于上一小节中生成的tree.o,将其与C标准输入输出库进行连接,最终生成程序test
gcc tree.o -o tree

运行验证:

四、静态库,动态库

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
1、静态函数库,是在程序执行前就加入到目标程序中去了 ;
2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
以选做MyOD为例
1、输入指令制作静态库

2、输入指令制作动态库

五、gdb相关练习
gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。
 一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
编写一个简单的c程序并使用gdb调试
先安装gdb

①start

用start命令开始执行程序:

②单步执行(n)

在start命令后,每输入一个n就能够单步执行一条语句(输入一个命令后,直接回车表示最近输入命令的含义)。当程序执行完时,可以输入quit命令来退出gdb模式。

③gdb断点调试

1)行断点

gdb a会进入a可执行程序的gdb模式
start命令就使程序准备运行程序中的第一条语句。
b 8是表示在此函数处设置一个断点,表示在程序第八行设置一个断点。
c表示继续运行程序,程序会在设置断点处停下来。
displayb表示将b的值显示出来(undisplay取消对变量的跟踪),然后再输入单步调试命令n(next)就可以使程序继续运行。
2)函数断点
b main

3)条件断点 B 4 if i=8;

4)观察断点:watch命令

四种断点分类整合

断点有助于快速跳过没有问题的代码,然后在有问题的代码上慢慢走慢慢分析,“断点加单步”是使用调试器的基本方法。至于应该在哪里设置断点,怎么知道哪些代码可以跳过,而哪些代码要慢慢走,也要通过对错误现象的分析和假设来确定,以前我们用printf打印中间结果时,也要分析应该在哪里插入printf,打印哪些中间结果,调试的基本思路是一样的。

六、编写makefile

也是基于MyOD选做
1、vim编写makefile

2、安装make

3、测试makeflie

makefile测试正确

遇到的问题:

openEuler安装vmtool里面的细节
右击虚拟机,点击安装vmtool

这时,DVD会变成vmware镜像,把里面的压缩包复制到桌面,然后解压,如图

在终端中运行解压文件夹中的.pl文件(perl xxx.pl),一直按enter键,即可装好[如果不是root权限需加个sudo]

如果不放心有没有装好,可以从主机拖拽文件查看,如下图:

由此看见,vmtool已经成功装上了

星光荡开宇宙
原文地址:https://www.cnblogs.com/pogbar/p/15339950.html