zoukankan      html  css  js  c++  java
  • 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已经成功装上了

    星光荡开宇宙
  • 相关阅读:
    ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
    初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
    初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
    codeforces 570 E. Pig and Palindromes (dp)
    codeforces 570 D. Tree Requests (dfs序)
    poj 2157 Maze (bfs)
    cf 570 C. Replacement (暴力)
    cf 570B B. Simple Game(构造)
    cf 570 A. Elections
    hdu 1429胜利大逃亡(续) (bfs+状态压缩)
  • 原文地址:https://www.cnblogs.com/pogbar/p/15339950.html
Copyright © 2011-2022 走看看