查找命令
find
通配符:*
和?
,*
可以匹配0个或多个字符,?
只能匹配单个字符
通过文件名搜索:-name
find 路径 -name "文件名" (单引号双引号都可以)
通过文件类型搜索:-type
通过文件大小搜索:-size
find后处理
处理find
后的结果:-exec
find
添加了exec
参数之后, 命令的尾部需要加一个后缀{} \;
, 注意 {}和\之间需要有一个空格。
find 路径 参数 参数值 -exec shell命令2 {} \;
如搜索到满足条件的文件后,再继续查看文件的详细信息等
-ok
也有相同的效果,不同点是处理前会询问是否处理
xargs
也有相同的效果且更高效,但需要通过|
来连接
find 路径 参数 参数值 | xargs shell命令2
grep
用于查找文件里符合条件的字符串
-r
递归搜索目录
-i
忽略大小写
grep "搜索内容" 搜索路径/文件 参数
同样单双引号都可以
locate
简化版的find,linux系统会自动创建一个本地数据库文件,每天自动更新一次。locate
可以查最近没有发生过变动的文件,或使用updatedb
更新数据库后,再查询
vim
vim有三种模式,命令模式、编辑模式、末行模式
搜索
直接按键盘上的/
即可
GCC
GCC有四个阶段:
- 预处理:展开头文件、宏替换、去掉注释行,得到
xxx.i
- 编译:得到汇编文件,得到
xxx.s
- 汇编:得到二进制文件,得到
xxx.o
- 链接:对程序要调用的库进行链接,最终得到一个可执行的二进制文件
静态库和动态库
静态库
静态库在编译链接阶段被复制到最终的可执行文件中,程序在运行时库文件
静态库比较少,主要是程序都在使用动态库
Linux中的静态库以lib
作为前缀,以.a
作为后缀,中间是库的名字,即:libxxx.a
Windows中静态库一般以lib
作为前缀,lib
作为后缀,即:libxxx.lib
生成静态库,通常先对原文件进行到汇编阶段得到.o
格式的二进制文件,然后通过内部工具ar
将文件打包得到静态库文件
动态库
程序运行时加载的库,可执行文件仅包含对库函数的引用,而不是库的代码本身。
Linux中动态库以lib
作为前缀,以.so
作为后缀,中间是库的名字,即:libxxx.so
Windows中静态库一般以lib
作为前缀,dll
作为后缀,即:libxxx.dll
生成动态库,直接使用gcc
命令,在汇编时使用-fpic
参数,在打包时使用-shared
参数
-fpic
参数的作用:静态库中使用的是绝对地址,而动态库在应用程序启动时才被加载到内存中,即可能被加载到内存的任何位置,故动态库中的函数和变量使用的是相对地址。其真实地址是动态连接器在程序运行期间通过引用映射加载出来的。具体地址解析过程取决于操作系统和动态链接器使用懒惰解析还是立即解析模式,大部分都是懒惰解析模式。
动态链接器:是一个独立于应用程序的进程, 属于操作系统。
Makefile
当文件逐渐增多,GCC就显得力不从心了,这时候就需要借助项目构造工具make
。make
是一个命令工具,是一个解释makefile中指令的命令工具。
make
工具在构造项目的时候需要加载一个叫做makefile
的文件,makefile
关系到了整个工程的编译规则。构建项目的时候在哪个目录下执行构建命令make
这个目录下的makefile
文件就会别加载。
Makefile规则
# 每条规则的语法格式:
target1,target2...: depend1, depend2, ...
command
...
...
每条规则由三个部分组成:target
、depend
、command
command
:一个shell命令depend
:依赖target
:target和command相对应,生成目标
一些执行与生成规则:
**可嵌套:**规则A在执行过程中,如果有不存在的依赖,这个规则A就不会被执行。如果该依赖会被后续的规则B生成,则会调用该规则B,生成需要的依赖,直到规则A中所有依赖都被生成,该规则A生成对应目标。
时间戳:首先,规则中的目标对应的文件不存在, 那么规则中的命令肯定会被执行。若该文件存在,当目标文件时间戳 > 所有依赖的时间戳,规则命令不会被执行;若目标时间戳 < 某些依赖的时间戳,说明新生成了依赖,故目标文件会被重新生成。
Makefile变量
分为三种:自定义变量、预定义变量、自动变量