学习笔记1
一、第一章知识点归纳
-
VirtualBox的下载及安装
-
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等
二、第二章知识点归纳
-
emacs
书上的emacs的介绍相对繁琐,我选择直接使用chatgpt帮助学习。
![]()
-
编译器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
-
调试器GDB
run/r:其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令
continue/c:继续执行,到下一个断点处(或运行结束)
next/n:单步跟踪程序,当遇到函数调用时,也不进入此函数体
step/s:单步调试如果有函数调用,则进入函数
until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体
finish:运行程序直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
quit/q:退出gdb
display:跟踪变量值的改变
help:帮助 -
makefile
(1)格式
一个make文件由一系列目标项、依赖项和规则组成。目标项通常是要创建或者更新的文件,但它也可能是make程序要吟咏的指令或标签。目标项依赖于一系列源文件、目标文件甚至其他目标项,具体描述见依赖项列表。规则是使用依赖项列表构建目标项所需的命令。
- targets是文件名,以空格分开,可以使用通配符
- command是命令行,必须以【tab键】开头
- prerequisites是依赖项
(2)变量
定义一个变量(宏定义),只要在一行的开始定义这个变量(一般大学,且放在makefile文件的顶部来定义),后面跟一个-号,=号后面即为设定的变量值。如果要应用该变量,用一个$符号应用变量即可,变量名需要放在$后的括号里。
一些特殊的内部变量:
- $@:指代当前规则下的目标文件列表
- $<:指代依赖文件列表中的第一个依赖文件
- $^:指代依赖文件列表中所有依赖文件
- $?:指代依赖文件列表中新于对于目标文件的文件列表
(3)问题及解决
资料中多为抽象的定义,示例代码没有注释,我阅读有些吃力,便寻找了chatgpt寻求帮助。


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


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

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



运行失败,出现了相同的问题难以进行
四、苏格拉底提问
-
Linux命令行
![]()
![]()
-
编译器gcc
![]()
![]()
-
调试器GDB
![]()
![]()
五、总结思考
第一二章学习内容很多,包括vim、emacs、gcc、gdb等等等等,我从网上搜索相关资料也看得一知半解,我到现在也没看懂makefile的相关内容。我原先还没有适应自主学习的学习模式,只能硬着头皮往前探索,经过痛苦的折磨总算了解了一些皮毛,果然学的痛苦才能学到东西。我也是第一次尝试在chatgpt的辅佐下完成更深层次的学习,这确实是一种自主学习的新思路,拥抱时代的产物才能勇立世界潮头。








浙公网安备 33010602011771号