教材第一、二章读书笔记
主要内容
- 第一章
主要学习了Unix的历史、开发及其各种发行版,列出了适用于Linux的各种硬件平台和虚拟机,揭示了常用的命令和文件系统组织、文件类型。 - 第二章
主要学习了基于GUI的编辑器,展示了如何在命令和GUI模式下使用EMACS编辑器来边集、编译和执行C语言程序,阐述了程序开发的步骤,阐阐释了函数调用惯例和运行时堆栈的使用,展示了C语言程序与汇编代码的链接,并举例说明如何编写makefile。
知识点归纳
- 文字编辑器
- vim(三种操作模式)
- gedit
- emacs
- 程序开发
- 开发步骤
- 创建源文件(变量的分类)
- 用gcc把源文件转换成二进制可执行文件
- 静态和动态链接
- a.out文件内容
- 程序执行过程:读取文件头>sh从总大小中分配一个内存区给执行映像>sh放弃旧映像
- 开发步骤
- C语言函数调用
- C语言程序和汇编代码的链接
- 链接库
- makefile
- GDB调试工具
- C语言相关知识:结构体、链表处理、树、二叉树
- Unix/Linux文件系统树编辑器
问题解决
- 静态库和动态库的区别
静态库在编译时被链接到可执行文件中,因此可执行文件包含了库的全部代码和数据,使得可执行文件较大。而动态库在运行时被加载到内存中,多个可执行文件可以共享同一个动态库,减少了可执行文件的大小。静态库的使用简单,只需要将库文件链接到可执行文件中即可。而动态库需要在运行时加载,需要操作系统提供动态链接器进行加载和链接。静态库的更新需要重新编译和链接可执行文件,而动态库的更新只需要替换库文件即可。
-- 引用自chatgpt
- 在学习GCC、GDB、Makefile后,我对于这三种工具和文本编辑器的关系和工作顺序还不太了解,通过gpt我得到了答案。
在项目生成过程中,通常的使用顺序是首先使用Vim编辑源代码文件和配置文件,然后使用GCC编译源代码生成可执行文件,接着使用GDB进行调试和错误修复,最后使用Makefile来自动化编译和构建整个项目。这样的使用顺序和作用可以帮助你完成项目的开发、调试和构建工作。
-- 引用自chatgpt
- gcc-g相当于gcc-E-S-c吗?
不完全相同。命令 "gcc -g" 是用于在编译过程中生成调试信息的选项,而命令 "gcc -E -S -c" 是将源代码文件进行预处理、汇编和编译的选项组合。
具体来说:
"-E" 选项表示只进行预处理,将宏展开并生成预处理后的代码。
"-S" 选项表示只进行汇编,将预处理后的代码转换为汇编代码。
"-c" 选项表示只进行编译,将汇编代码转换为目标文件,不进行链接。
而 "-g" 选项是用于在编译过程中生成调试信息,包括源代码的行号、变量的值等,以便在调试过程中进行源代码级别的调试。
因此,虽然两个选项都与编译过程有关,但其功能和作用是不同的。
-- 引用自chatgpt
苏格拉底挑战
知识点1:vim
知识点2:GCC、GDB
个人收获
- 学习了Linux编程的基础工具:GCC、GDB、MAKEFILE
在学习相关内容之前,我只在C语言程序设计和数据结构学习过C语言的编辑,而通过学习我了解到GCC的编译分为四个步骤——编译预处理,编译,汇编,链接;GDB则是在编译后进行程序的调试;而makefile管理代码的编译,决定编译顺序和是否需要重新编译,如果文件有更改,只需要重新编译此文件而不需要重新编译整个工程。 - 学习了Unix/Linux文件系统树模拟器
教材通过C语言程序实现了Uinx/Linux文件系统模拟器,使我们更易于理解Linux的文件结构。 - 这是我使用chatgpt频率最高的一周,但我仍需探究如何将向gpt获取答案的过程转化为汲取思路的过程。