一 编译器gcc/g++
1.理解编译
1.预处理
进行宏替换、去注释、条件编译、头文件展开,预处理指令是以#为开头的代码行,预处理后的文件以.i为结尾,“-E” 的作用是让gcc在预处理结束后停止编译过程,“-o”指目标文件
gcc -E test.c -o test.i
2.编译
在编译过程中,gcc检查代码的规范性和语法错误,确定代码要做的工作,检查无误后,gcc将代码翻译为汇编语言,编译后的文件以“.s”来结尾,-S的作用是只进行编译而不进行汇编,生成汇编代码。
gcc -S test.i -o test.s
3.汇编
把编译阶段生成的“.s”文件转成以“.o”为后缀的目标文件,“-c”将汇编代码转为二进制目标的代码。
gcc -c test.s -o test.o
4.链接
生成可执行文件或库文件
gcc test.o -o test
2.动态链接和静态链接
静态链接:在编译时将库的代码整合到可执行文件中,将库中的文件和目标文件进行链接,从而形成一个可执行程序,这个链接的过程就是静态链接。
其缺点一是浪费空间,可执行程序对所有需要的目标文件都要一份副本,如果多个程序对目标文件有依赖,就会出现同一个目标文件在内存中出现多个副本的现象;二是依赖性太大,每当库函数的代码修改了,所有的目标文件就要重新进行编译,不利于更新
但其优点是可执行程序已经具备了所有可执行程序所需要的东西,执行速度就比较快。
动态链接:在程序运行时才链接所需的库
可以使用指令ldd来查看一个可执行程序所依赖的动态库,test就依赖了一个c的动态链接库
这里涉及一个概念就是库
静态库:指编译链接时,将库文件全部加入到可执行文件中,因此生成的文件较大,在运行时就不需要库文件了,其后缀名一般为“.a”.
动态库:在程序执行时将运行时的链接文件加载库,节省了系统的开销,后缀名一般为“.so”,gcc在编译时默认使用动态库,完成链接后,gcc就生成可执行文件。
3.gcc其他命令选项
- -static :对生成的文件采用静态链接
- -g:生成调试信息,GNU调试器可用此选项
- -w:不生成任何警告信息
- -Wall:生成所有警告信息
二、自动化构建-Makefile/make
1.认识make和Makefile
Makefile是一个文件,make是一个指令。
在一个工程中源文件很多,按其类型、功能、模板放在各个目录中,Makefile定义了一系列的规则来指定文件编译的先后顺序以及是否需要重更新编译,以及其他对文件的复杂操作,就是一个“自动化编译”的过程,一旦写好Makefile文件,执行make指令,整个工程就会自动编译。
2.使用
test:test.ogcc -o test test.o//gcc前必须使用Tab,不可以输入空格test.o:test.sgcc -c test.o -o test.stest.s:test.igcc -S test.s -o test.itest.i:test.cgcc -E test.i -o test.c.PHONY:cleanclean:rm -f test
文件编译时,源文件和和可执行文件是相互依赖的,上述指令中的依赖关系是test依赖test.c,依赖方法是” gcc -o test test.c“
项目清理:工程是要被清理的,就用到了clean指令,但是没有被目标文件直接或间接关联,那么它后面所定义的命令不会自动被执行,但是可以显示用”make clean“来执行,以此清除所有目标文件,以便重新编译。
但是一般这种clean的目标文件,我们将它设置为伪目标,使用.PHONY来修饰,伪目标的特性是,总是被执行。
什么叫做总是被执行呢?
Make工具通过检查目标文件和依赖文件的时间戳来决定是否需要重新构建目标。如果目标文件不存在,或者依赖文件比目标文件新,就会执行对应的命令。但clean这样的目标通常不生成任何文件,只是用来清理生成的文件,比如删除.o或可执行文件。如果用户有一个名为clean的文件存在,make会发现clean文件已经存在,并且没有依赖文件比它新,所以不会执行clean的命令。这时候.PHONY的作用就是告诉make,这个目标不是一个实际的文件,无论是否存在同名文件,都应该执行其命令。
当我们输入make指令时,make是如何工作的呢?
1. make会在当前⽬录下找名字叫“Makefile”或“makefile”的⽂件。2. 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的例⼦中,他会找到 test 这 个⽂件,并把这个⽂件作为最终的⽬标⽂件。3. 如果 test ⽂件不存在,或是 test 所依赖的后⾯的 test.o ⽂件的⽂件修改时间要 ⽐ test 这个⽂件新(可以⽤ touch 测试),那么,他就会执⾏后⾯所定义的命令来⽣成 test 这个⽂件。4. 如果 test 所依赖的 test.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为 test.c ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 test.o ⽂件。(这有点像⼀ 个堆栈的过程)5. 当然,你的C⽂件和h⽂件是存在的啦,于是 make 会⽣成 ⽂件,然后再⽤ test.o ⽂件声明 make 的终极任务,也就是执⾏⽂件 test 了。6. 这就是整个make的依赖性,make会⼀层⼜⼀层地去找⽂件的依赖关系,直到最终编译出第⼀个⽬标⽂件。7. 在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并报错,⽽对于所定义的命令的错误,或是编译不成功,make根本不理。make只管⽂件的依赖性,即,如果在我找了依赖关系之后,冒号后⾯的⽂件还是不在,那么对 不起,我就不⼯作啦。
3.扩展使用
1 BIN=test2 CC=gcc3 #SRC=$(shell ls*.c)#采用shell命令行的方式,获取当前所有的.c文件4 SRC=$(wildcard*.c)#使用wildcard函数,获取当前所有的.c文件5 OBJ=$(SRC:.c=.o)#SRC所有的同名.c替换为.o形成的目标文件列表6 LFLAGS=-o #链接选项7 FLAGS=-c #编译选项8 RM=rm -f #引入命令9 10 $(BIN):$(OBJ)11 @$(CC) $(LFLAGS) $@ $^ #$@:代表目标文件名,$^:代表依赖文件列表12 @echo "linking ... $@ to $^"13 %.o:%.c #%.c:展开当前目录下所有的.c,%.o:同时展开所有同名.o14 @$(CC) $(FLAGS) $<15 @echo "compling ... $< to $@"16 17 .PHONY:clean18 clean:19 $(PM) $(OBJ) $(BIN)20
三、版本控制器 -git
1.了解版本控制器
所谓版本控制器,就是能让你了解到一个文件的历史,以及它发展过程的系统,通俗讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,方便多人协同作业。
目前主流的版本控制器就是git,可以控制电脑上所有格式的文件,对于开发人员来说,git就i是帮我们管理软件开发项目中的源代码文件。
2.git的安装
apt install git
3.在Gitee中创建项目
1.登录进入个人主页(切记一定要记住登录的用户名和密码),点击右上角的新建仓库
2.跳转到新页面输入仓库名称,名字不可以重复,点击创建
3,将仓库克隆到本地,可以使用https,也可以使用ssh,ssh的好处就是每次push和pull时无需输入用户名和密码,而且更为安全
点击克隆/下载按钮,按提示在终端进行命令行输入
4.git指令
1.将代码放到刚下载好的目录
git add [文件名]
2.将代码提交改动到本地
git commit -m "XXXXXXX"
"XXXXXX":提交的时候应该注明提交⽇志, 描述改动的详细内容.
3.将本地仓库同步到远端服务器
git push
4.查看提交历史的核心命令
git log
它可以帮助你查看仓库的版本演变、提交信息、作者、时间等详细信息
5. 显示工作目录和暂存区的状态
git status
了解哪些文件被修改了、哪些文件是新的、哪些文件被删除了以及是否有未提交的更改
6. 将远程仓库的更改合并到本地仓库
git pull <远程仓库名称> <分支名称>
5.git同步更新到远端服务器的本质
git先add添加到git的缓冲区(或叫暂存区),然后commit提交到本地,最后push同步到远端服务器。
6. .gitignore文件
该文件里面的内容是需要忽略的特定后缀的文件列表,当我们提交代码到本地仓库时,会自动忽略以这些文件为后缀的文件。