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已经成功装上了

    星光荡开宇宙
  • 相关阅读:
    TP5.1 路由验证器验证返回json提示
    win10 docker ubuntu14.04 php 编译安装 php7.3.20
    ubuntu15.10 sources.list 修改
    秒杀系统设计
    class命名规范
    php实现阿里云签名类
    【小程序】应用的生命周期,页面的生命周期
    php.ini配置文件参数中文说明文档
    tp5.1 nginx配置
    phpstudycomposer thinkPHP5.1 使用
  • 原文地址:https://www.cnblogs.com/pogbar/p/15339950.html
Copyright © 2011-2022 走看看