一、Review
1、编译的四个过程:预处理-》编译-》汇编-》链接
预编译: gcc-E test.c -o test.i | 预编译头文件 |
编译:gcc -S -test.i -o test.s | 将高级语言源程序编程汇编指令 |
汇编:as test.s -o test.o | 将汇编指令变成机器指令 |
链接:gcc -o test test.o | 将机器指令编程二进制可执行文件 |
2、动态库和静态库
(1)静态库:编译时被编入可执行程序,可执行程序执行时不依赖静态库
(2)动态库:编译时不会被编入可执行程序,只是做动态链接,可执行程序执行时依赖动态库
3、gdb
(1)gdb调试前,需要在编译时加入-g参数,命令为gcc -g main.c
(2)之后输入指令gdb a.out
(3)传递参数使用命令set args 3 4
(4)显示参数show args
(5)有一个数组名,看该数组的内存空间 x /20xb &arr
(6)进入一个函数 s
(7)从当前函数运行出来finish
(8)运行至断点c
(9)显示堆栈bt
(10)打临时断电tb
(11)查看断点信息 info b
(12)删除断点信息delete 3
(13)程序执行崩溃怎么办?使用core调试
4、①在Linux下执行程序一般是使用./[文件名]执行文件
二、Makefile工程管理器
目的:写出一个比较通用的Makefile
1、为什么使用Makefile工程管理器?便于对程序进行修改,因为现在大公司中的程序大多是使用的增量编译,这样可以知道应该再编译哪些文件。
2、写一个Makefile的例子
3、Makefile可以自动实现增量编译,是通过程序的修改时间实现的
4、执行命令make时,该命令会自动在当前目录下找Makefile文件
5、执行命令make clean后,该命令会在Makefile中寻找名为clean的文件并执行程序
6、确保Makefile编译出的程序可以清理,可以重新编译
7、自动变量:
8、同时编译出多个可执行二进制文件的目的?为了多个测试用例;可以同时编译出多个含有main函数的.c的文件
9、Makefile也可以自动生成,使用中间件可以实现
10、当要把多个.c文件编译成各自名字的可执行程序
三、文件操作
1、如何在头文件里封装、使用反斜杠\
2、ftell函数返回的是光标距离文件头部的值
3、不论什么设备,在Linux下,都把它当做普通文件去进行管理,在/dev文件加下,都可以看到对应的设备。
4、软链接:通过lln实现链接效果
5、如果使用fopen的W+模式创建文件,则默认创建的文件的权限是666;
Linux在编程中创建的文件可以指定权限。
与Windows不同,Linux下的文件读取方式有6种,而非Windows的12种
四、下午的内容-文件操作
1、如何将PATH永久添加内容?在Bashrc中增加一句话
2、遍历某一个目录的程序
#include<stdio.h>
#include<stdlib.h>
Int main(itn argc,char*argc[]){
ARGS_CHECK(args,2);
DIR*dir;
Dir=opendir(argc[1]);
ERROR_CHECK
Struct dirent *p;
While(p=readdir(dir))
{
Printf("ino=%ld, lrn=%d type=%d filename=%s\n",p->d_ino,p->d_reclen.p->d_type,o->d_name)
}
Close(dir);
Return 0;
3、inode的值对应磁盘上的唯一数据,引用计数即为硬链接,
使用命令ln opendir.c opendir2.c,则可以创建一个硬链接。要注意硬链接和软链接的区别
删除引用了硬链接的文件,如果还有其他的引用文件,那么只是引用计数减一
4、另一个例子finddir
打开一个目录,之后打开该目录下的一个文件,如果该文件是目录,那么继续打开该目录下的目录下的文件,这是一个递归操作,因此可以写作深度优先遍历
#include<stdio.h>
#include<stdlib.h>
Void printDir(char *path,,int width){
DIR*dir;
Dir=opendir(argc[1]);
ERROR_CHECK;
Struct dirent *p;
Char buf[2014]={0};
While(p=readdir(dir)) //注意,遍历时对.和..不需要打开
{
If(strcpy(p->d_name,".")||strcpy(p->d_name.".."))
{
Continue;
}
Printf("%s\n",p->d_name);
Sprintf(buf,"%s%s%s",path,"/",p->d_name);
If(p->d_type==4)
{
printfDir
printDir(p->d_name);
}
}
Close(dir);
Return 0;
}
Int main(itn argc,char*argc[]){
ARGS_CHECK(args,2);
Puts(argv[1]);
printDir(argc[1]);
Return 0;
5、C语言是效率最高的高级语言
6、如何安装youcompleteme?
Ubuntu18.04安装好之后,进入系统
```shell
"开始安装"
一、基本安装
" ifconfig使用"
$ sudo apt install net-tools
$ sudo apt install ssh
$ sudo apt install vim
$ sudo apt install git
"C/C++编译工具链"
$ sudo apt install gcc
二、vim插件安装
"安装vim-plug"
$ sudo apt install curl
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
在.vimrc中增加以下内容
call plug#begin('~/.vim/plugged')
Plug 'Valloric/YouCompleteMe', { 'do': './install.py --clang-completer', 'for': ['c', 'cpp'] }
call plug#end()
$ vim "进入到vim页面,在命令行模式之下执行
:PlugInstall
"为界面美化下载的字体"
$ sudo apt-get install fonts-powerline
"安装YCM"
$ sudo apt install build-essential cmake python3-dev
$ sudo apt install clang libclang-dev
$ cd ~/.vim/plugged/YouCompleteMe
$ python3 install.py --clang-completer
使用默认配置
在.vimrc中添加
let g:ycm_global_ycm_extra_conf='~/.vim/plugged/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'
-----------------------
针对18.04的快捷方法
sudo apt install gcc
sudo apt install vim-youcompleteme
vim-addons install youcompleteme
视频:
第五个:
1、首先,使用哪一条指令,要先把实现该指令需要的头文件放到引用的头文件中,例如使用fopen函数,需要将该函数依赖的头文件fcntl.h放到之前定义好的头文件func.h中
2、使用fopen函数时,需要的参数有open(pathname,权限,mode)
对于位权限,如果想实现两种权限,那么应该将这两种权限对应的位码进行或操作
3、mmap的功能,不需要读写,也可以改变文件内容,采用的就是磁盘内存映射机制,把磁盘映射到内存里
DMA技术:使数据不经过CPU,直接从磁盘到内存
mmap的一个缺点是,它不能改变文件大小,因为他采用的是映射的原理