zoukankan      html  css  js  c++  java
  • Linux实验总结(第二周)

    测试一——vi

    1. 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
    2. 用Vi输入图中代码,并用gcc编译通过
    3. 在Vi中使用K查找printf的帮助文档
    4. 提交vi编辑过程截图,要全屏,包含自己的学号信息

    步骤

    使用 mkdir 分别创建三个目录,分别存放源码,头文件和输出文件,输入命令 vi *.cvi *.h,敲入代码即可,以下是输入完毕后的文件及文件夹目录:

    这是vi中的printf帮助文档,首先 cd src ,然后 vi main.c ,将光标移动到printf上去,按大写的K即可:

    通过gcc编译通过

    gcc -I include src/*.c -o bin/20199324
    

    测试二——gcc测试

    1. 用 gcc 进行预处理,编译,汇编,链接vi输入的代码
    2. 生成的可执行文件中要有自己的学号
    3. 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息

    使用到的命令

    gcc -E .c -o .i   //预处理
    gcc -S .i -o .s   //编译,产生汇编代码
    gcc -c .s -o .o   //汇编,编译为目标文件(.o文件,可重定位目标文件)
    gcc *.o -o XXX    //链接生成可执行文件
    

    步骤

    预处理:

    gcc -E -I include src/*.c -o bin/*.i
    

    编译:

    gcc -S -I include bin/*.i -o bin/*.s
    

    汇编:

    gcc -c -I include bin/*.s -o bin/*.o
    

    链接:

    cd bin 
    gcc *.o -o test
    

    测试三——gdb测试

    1. gcc -g 编译vi输入的代码
    2. 在main函数中设置一个行断点
    3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
    4. 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

    gdb相关命令

    1. [root@redhat home]# gdb 调试文件:启动gdb
    2. (gdb) l:从第一行开始列出源码
    3. (gdb) r Run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处;
    4. (gdb) n 单步执行
    5. (gdb) c Continue的简写,继续执行被调试程序,直至下一个断点或程序结束;
    6. (gdb) b 8 b: Breakpoint的简写,设置断点。在源程序第8行;
    7. (gdb) b X(整数) if i==X 设置条件断点,在for循环后一行设置;
    8. (gdb) p <变量名称> Print的简写,打印变量的值;
    9. (gdb) q Quit的简写,退出GDB调试环境;
    10. (gdb)info b 查询所有断点;
    11. (gdb)delete 行号 删除断点

    步骤

    首先要gcc -g来生成一个可执行文件

    gcc -g *.c
    

    设置一个行断点:

    设置条件断点:

    测试四——静态库的测试

    1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
    2. 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

    步骤

    1. 无论静态库,还是动态库,都是由.o文件创建的。

    分别对四个c文件生成编译文件 (因为之前已经有编译好的.o文件,所以没有重复该步骤。。。但是后来gdb调试的时候发现不行,因为之前编译的.o文件时候没有加-g,所以还是得加这一步骤)

    gcc -g -c *.c 
    
    1. 然后将编译文件生成mymath.a静态库
    ar rcvs(rc/rcs) mymath.a add.o sub.o div.o mul.o
    
    1. 用mymath.a文件生成一个可执行文件prog
    gcc -g -static -o prog main.o ./mymath.a 
    
    1. 运行
    ./prog
    



    对可执行文件的调试:

    测试五——共享库

    1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
    2. 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

    步骤

    1. 编译生成共享库。加上-shared -fpic参数,生成共享文件mymath.so
    gcc -g -shared -fpic -o mymath.so add.c sub.c mul.c div.c
    
    1. 编译生成可执行文件
    gcc -g -o prog1 mian.c ./mymath.so
    
    1. 运行
    ./prog1
    

    知识点

    • 什么是库?
      • 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
      • 由于windows和linux的本质不同,因此二者库的二进制是不兼容的。
    • 库的种类
      • linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。
      • 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
      • 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
      • 静态库的后缀是 .a
      • 动态库的后缀是 .so

    测试六-Makefile

    1. 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath,只用显式规则就可以
    2. 提交Make过程截图,要全屏,包含自己的学号信息
    • Makefile
      • 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。其带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。
      • makefile文件编写规则:
        • 目标文件:由make创建,通常是目标文件或可执行文件
        • 依赖文件:创建目标体所依赖的文件
        • 运行命令:创建每个目标体时需要的运行命令,必须以tab键开头
        • 格式为:目标文件:依赖文件列表 [tab键]各目标体运行命令(注意不是空格)
        • 使用make的格式:make 目标文件

    步骤:

    1. 输入sudo gedit Makefile,输入代码并保存。编写的Makefile文件内容:
    testmymath: main.o add.o sub.o mul.o div.o 
    	gcc main.o add.o sub.o mul.o div.o -o testmymath
    main.o: main.c head.h
    	gcc -c main.c
    add.o: add.c head.h
    	gcc -c add.c
    sub.o: sub.c head.h
    	gcc -c sub.c
    mul.o: mul.c head.h
    	gcc -c mul.c
    div.o: div.c head.h
    	gcc -c div.c
    
    1. 输入 make,进行自动化编译
    2. 执行 ./testmymath查看结果

    image

    注意:(自己虚拟机下命令的注意事项)

    1. 删除普通文件
    gcc rm 文件名
    
    1. 删除当前目录下的所有文件及目录
    gcc rm -rf 目录名
    
    1. 用vim或gedit(文本编辑器)时候一定要在前面加sudo,否则没有权限修改或保存。

    2. -I xxx 的意思是除了默认的头文件搜索路径(比如/usr/include等)外,同时还在路径xxx下搜索需要被引用的头文件。

    3. gcc常用命令区分

    gcc -c *.c //把.c文件转换为目标文件.o (预处理、编译、汇编)

    gcc *.c // 编译成a.out可执行文件

    gcc *.c -o XXX //一步到位的编译指令(实质上,该编译过程是分为四个阶段进行:预处理、编译、汇编、链接)

    gcc -g 编译vi输入的代码:加上-g选项以后,gcc在编译是会做以下额外的操作:

    • 创建符号表,符号表包含了程序中使用的变量名称的列表。
    • 关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行。
    • -g为了调试用的。加个-g 是为了gdb 用,不然gdb用不到。

    参考资料:

    https://blog.csdn.net/oqqhutu12345678/article/details/78938688
    https://blog.csdn.net/Linkthaha/article/details/39996897
    https://blog.csdn.net/zhangsmlyl/article/details/78941158
    https://zhidao.baidu.com/question/313935918.html

  • 相关阅读:
    海思HI3516A开发板顺利上线
    android WIFI信息获取
    五------Jsp九大内置对象。
    在Windows下搭建Apacheserver
    基于ContentObserver来动态取消或加入屏幕超时任务
    使用Intent的Flag设置启动參数
    IntelliJ IDEA像Eclipse一样打开多个项目
    怎样让IE支持自己定义协议
    《TCP/IP具体解释卷2:实现》笔记--协议控制块
    POJ2029:Get Many Persimmon Trees(二维树状数组)
  • 原文地址:https://www.cnblogs.com/yangdd/p/12002753.html
Copyright © 2011-2022 走看看