学习笔记1

一、第一章知识点归纳

  1. VirtualBox的下载及安装

  2. Unix/Linux文件系统组织

  • 文件系统树

  • Unix/Linux命令
    ls: ls dirname: 列出目录内容
    cd dirname: 更改目录
    pwd: 打印CWD的绝对路径名
    touch filename: 更改文件名时间戳(如果文件不存在则创建文件)
    cat filename: 显示文件内容
    cp src dest: 复制文件
    mv src dest: 移动后重命名文件
    mkdir dirname: 创建目录
    rmdir dirname: 移除(空目录)
    rm filename: 移除或删除文件
    In oldfile newfile: 在文件之间创建链接
    find: 搜索文件
    grep: 搜索文件中包含模式的行
    ssh: 登录到远程主机
    gzip filename: 将文件压缩为.gz文件
    gunzip file.gz: 解压.gz文件
    tar -zcvf file.tgz .: 从当前目录创建压缩tar文件
    tar -zxvf file.tgz .: 从.tgz文件中解压文件
    man: 显示在线手册页
    zip file.zip filenames: 将文件压缩为 .zip文件
    unzip file.zip: 解压.zip文件

  • Linux手册页
    在Ubuntu Linux中,手册页保存在/usr/share/man目录下,所有的手册也均为压缩.gz文件。
    man1: 常用命令:ls、cat、mkdir等
    man2: 系统调用
    man3: 库函数:strtok、strcat、basename、dirname等

二、第二章知识点归纳

  1. emacs
    书上的emacs的介绍相对繁琐,我选择直接使用chatgpt帮助学习。

  2. 编译器gcc

  • gcc编译过程
    预处理(Pre-Processing)
    编译(Compiling)
    汇编(Assembling)
    链接(Linking)

  • gcc常用选项
    -E: 仅执行编译预处理
    -S: 将C代码转换为汇编代码
    -c: 仅执行编译操作,不进行连接操作
    -o: 指定生成的输出文件
    -I: 指定头文件目录
    -l: 指定程序要链接的库
    -L: 指定库文件所在的目录名
    拓展:多模块编译
    一起编译:gcc test_a.c test_b.c -o test或者gcc *.c -o test
    分别编译:gcc -c test_a.c gcc -c test_b.c gcc -o test_a.o test_b.o -o test

  • 项目的目录结构
    scr:存放.c文件
    include:存放.h文件也就是头文件
    bin:存放项目调试之后的可运行文件
    libs:存放动态库和静态库文件
    Readme.md:阅读指南文件,包括如何使用程序等
    makefile:描述了整个工程的编译、链接等功能

  • 静态库与动态库
    (1)静态库:
    输入gcc -c -l/头文件所在路径 add.c sub.c mul.c div.c生成.o文件
    输入ar rcvs libmath.a add.o sub.o mul.o div.o 生成静态库
    输入gcc main.c -o main -l/头文件所在路径 -L -lmath生成可执行文件main
    (2)动态库
    输入gcc -fPIC -c -l/头文件所在路径 add.c sub.c mul.c div.c生成.o文件
    输入gcc -shared -o libmath.so add.o sub.o mul.o div.o 生成动态库
    将文件libmath.so复制到目录/use/lib中后,再输入gcc main.c -o main -l/头文件所在路径 -L -lmath生成可执行文件main

  1. 调试器GDB
    run/r:其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令
    continue/c:继续执行,到下一个断点处(或运行结束)
    next/n:单步跟踪程序,当遇到函数调用时,也不进入此函数体
    step/s:单步调试如果有函数调用,则进入函数
    until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体
    finish:运行程序直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
    quit/q:退出gdb
    display:跟踪变量值的改变
    help:帮助

  2. makefile
    (1)格式
    一个make文件由一系列目标项、依赖项和规则组成。目标项通常是要创建或者更新的文件,但它也可能是make程序要吟咏的指令或标签。目标项依赖于一系列源文件、目标文件甚至其他目标项,具体描述见依赖项列表。规则是使用依赖项列表构建目标项所需的命令。

  • targets是文件名,以空格分开,可以使用通配符
  • command是命令行,必须以【tab键】开头
  • prerequisites是依赖项
    (2)变量
    定义一个变量(宏定义),只要在一行的开始定义这个变量(一般大学,且放在makefile文件的顶部来定义),后面跟一个-号,=号后面即为设定的变量值。如果要应用该变量,用一个$符号应用变量即可,变量名需要放在$后的括号里。

一些特殊的内部变量:

  • $@:指代当前规则下的目标文件列表
  • $<:指代依赖文件列表中的第一个依赖文件
  • $^:指代依赖文件列表中所有依赖文件
  • $?:指代依赖文件列表中新于对于目标文件的文件列表

(3)问题及解决
资料中多为抽象的定义,示例代码没有注释,我阅读有些吃力,便寻找了chatgpt寻求帮助。

(4)参考资料
https://blog.csdn.net/weixin_51363326/article/details/121127034?ops_request_misc=&request_id=&biz_id=102&utm_term=makefile&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-121127034.142v93chatsearchT3_2&spm=1018.2226.3001.4187

三、自主练习

  1. 练习gcc编译运行代码
    我先寻求chatgpt获得示例,然后按照它的步骤进行操作

运行失败,询问chatgpt但依然无法解决

  1. 练习gdb调试代码
    我先寻求chatgpt获得示例,然后按照它的步骤进行操作

运行失败,出现了相同的问题难以进行

四、苏格拉底提问

  1. Linux命令行

  2. 编译器gcc

  3. 调试器GDB

五、总结思考
第一二章学习内容很多,包括vim、emacs、gcc、gdb等等等等,我从网上搜索相关资料也看得一知半解,我到现在也没看懂makefile的相关内容。我原先还没有适应自主学习的学习模式,只能硬着头皮往前探索,经过痛苦的折磨总算了解了一些皮毛,果然学的痛苦才能学到东西。我也是第一次尝试在chatgpt的辅佐下完成更深层次的学习,这确实是一种自主学习的新思路,拥抱时代的产物才能勇立世界潮头。

posted @ 2023-09-10 22:01  梁小轩  阅读(24)  评论(0)    收藏  举报