删除文件目录
rm -r <目录路径>
rmdir <空白目录>
gcc命令
- 只编译不链接
gcc -c <源文件.c>
- 链接为.out
gcc <源文件.c> -o <可执行文件名>
静态库的制作
预处理
.h .c .cpp
编译gcc -c <源文件.c>
ar rcs <静态库文件名/libxxx.a><目标文件2> ...
链接
指定头文件路径、库文件和库路径
gcc -I<头文件路径> -L<库路径> -l<库名>
动态库的制作
预处理
.h .c .cpp
编译
-fpic
生成与位置无关的代码
gcc -c -fpic source.c -o object.o
gcc -shared -o libexample.so source1.o source2.o
链接
配置环境变量
用户级别export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
~/ .bashrc
添加后刷新source .bashrc
系统级别sudo vim /etc/profile
中添加环境变量,保存后source /etc/profile
静态库和动态库的对比
静态库:
- 优点:
打包到应用程序中加载速度快
发布程序无需提供静态库,移植方便 - 缺点
消耗系统资源、浪费内存
更新、部署、发布不方便
动态库:
- 优点:
可以实现进程间资源共享
更新、部署、发布方便
可以控制何时加载动态库 - 缺点:
加载速度慢
发布程序时提供依赖的动态库
Makefile
规则
-
一个文件中可以有一个或多个规则
目标 …: 依赖 …
命令(shell
命令)
…
如果依赖比目标的文件时间晚,需要重新生成文件 -
其他规则一般为第一条规则服务
-
定义变量:
src=$(wildcard ./*.c)
:使用wildcard函数获取当前目录下的所有.c文件,并将结果赋值给src变量。
objs=$(patsubst %.c, %.o, $(src))
:使用patsubst
函数将src中的.c文件替换为对应的.o文件,并将结果赋值给objs变量。
target=app
:定义目标文件的名称为app。 -
目标和依赖规则:
$(target):$(objs)
:定义了$(target)
作为目标文件,依赖于$(objs)
中的所有文件。
$(CC) $(objs) -o $(target)
:使用变量$(CC)
表示编译器,将$(objs)
中的所有文件链接为一个可执行文件,输出为$(target)
。 -
模式规则:
%.o:%.c
:定义了一条模式规则,用于生成.o文件。它表示任意.o文件依赖于同名的.c文件。
$(CC) -c $< -o $@
:使用变量$(CC)
表示编译器,通过-c选项将.c文件编译为.o文件。 -
.PHONY规则:
.PHONY:clean
:声明clean为伪目标,即不是真正的文件。
clean: rm $(objs) -f
:定义了一个名为clean的规则,用于删除所有的.o文件。
GDB
- 通常关掉优化选项
-o
使用-g
-Wall
- 启动和退出
gdb 可执行文件
quit
- 设置参数/获取参数
set args 10 20
show args
- 查看代码
list/l 文件名:行号/函数名
断点操作
- 设置断点
break/b 行号/函数名//文件名:行号/函数名
- 查看断点
info/i break
- 删除断点
d/del/delete 断点编号
- 设置断点生效/无效
enable/ena disable/dis
- 设置条件断点
break 10 if i==5
调试命令
- 运行GDB程序
start(第一行)/run(到断点)
- 继续
continue/c
- 向下执行一行代码(不会进入函数体)
next/t
- 变量操作
print/p 打印变量名
ptype 打印变量类型
- 向下单步调试
step/s finish(跳出)
- 自动变量
display num 自动打印指定变量的值
info/i display
undisplay
- 其他操作
set var 变量名=变量值
until(跳出循环)
文件管理
open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//打开一个已经存在的文件
int open(const char *pathname, int flags);
//创建一个新的文件
int open(const char *pathname, int flags, mode_t mode);
参数:
- pathname:文件路径
- flags:对文件的操作权限设置和其他设置
O_RDONLY, O_WRONLY, or O_RDWR
O_CREAT 文件不存在,创建新文件
为int类型数据,占4个字节,32位,每一位就是一个标志位
- mode:八进制的数,表示创建出的新文件的操作权限,比如:0777
mode & ~umask(0002)
0777 -> 111111111
& 0775 -> 111111101
----------------------
111111101
umask作用为抹去某些权限
返回值:返回一个新的文件描述符,如调用失败则返回-1;
errno:属于Linux系统函数库中的一个全局变量,记录的是最近的错误号
#include <stdio.h>
void perror(const char *s);
参数s:用户描述,比如hello,最终输出的内容为: hello:xxx(实际错误描述)
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
- fd: 文件描述符,由open得到
- buf:需要读取数据存放的地方,数组的地址
- count:指定数组的大小
返回值:
- 成功:
>0:返回实际读取到的字节数
=0:文件读取完毕
- 失败:-1 ,并设置errno
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
- fd: 文件描述符,由open得到
- buf:需要往磁盘写入的数据
- count:写入数据实际大小
返回值:
- 成功:实际写入的字节数
- 失败:-1 ,并设置errno
lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
参数:
- fd:文件描述符
- offset:
- whence:
SEEK_SET
设置文件指针偏移量
SEEK_CUR
设置偏移量:当前位置+第二个参数offset的值
SEEK_END
设置偏移量:文件大小+第二个参数offset的值
返回值:返回文件指针的位置
作用:
1.移动文件指针到文件头
lseek(fd,0,SEEK_SET);
2.获取当前文件指针的位置
lseek(fd,0,SEEK_CUR);
3.获取文件长度
lseek(fd,0,SEEK_END);
4.拓展文件的长度
lseek(fd,100,SEEK_END);
PS:需要写一次数据才能生效
stat
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
作用:获取文件相关的信息
参数:
- pathname:操作文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
作用:获取文件相关的信息
参数:
- pathname:操作文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
#include <fcntl.h>
#include <sys/stat.h>
int fstatat(int dirfd, const char *pathname, struct stat *statbuf,
int flags);
*/
#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
int main(){
struct stat statbuf;
int ret =stat("a.txt",&statbuf);
if(ret==-1){
perror("stat");
return -1;
}
printf("size: %ld\n",statbuf.st_size);
return 0;
}
文件属性
int access(const char* pathname, int mode);
作用:判断某个文件是否有某个权限,或者是否存在;
返回值:成功为0,失败为-1;int chmod(const char* filename,int mode);
作用:修改文件的权限
返回值:成功为0,失败为-1;int chown(const char* path,uid_t owner,gid_t group);
作用:设置文件所有者和文件关联组int truncate(const char* path,off_t length);
作用:缩减或拓展文件的尺寸到制定大小;
返回值:成功为0,失败为-1;