linux 系统编程基础部分 day1
常用指令
创建修改用户组
查看当前用户组:whoami
创建用户 sudo adduser 用户 sudo addgroup 组名
添加权限:chmod [u,g,o,a]+[x,w,r] 数字表示法r4 w2 x1 chmod 471 每个权限种类想加
给文件换所属用户 chown 新用户名 文件名 chgrp
递归查找:find 路径 -type/name ' ' 无递归: find 路径 -maxdepth 1 -type/name '文件名';
type按照文件类型 name按照文件名 maxdepth搜索深度 size按文件大小
ps aux | grep ' ' grep -r 'copy' ./ -n find 之后不能交给 管道 | 运行 可以加xargs
gcc编译可执行程序4步骤
编译阶段消耗时间、系统资源最多。
gcc -I 地址 指定头文件目录 -g gdb调试 -Wall 显示所有警告信息 -D 像程序中”动态“注册宏定义。
静态库和动态库
静态库:对空间要求较低,而对时间要求较高的核心程序中
动态库:对空间要求较高,而对时间要求较低的核心程序中
头文件守卫:防止头文件被重复包含
#ifndef _HEAD_
#define _HEAD
#endif
动态库制作及引用
1、将.c生成.o文件(生成与位置无关的代码 -fPIC)
gcc -c add.c -o add.o -fPIC
2、使用gcc -shared 制作动态库
gcc -shared lib库名.so add.o sub.o div1.o
3、编译可执行程序时,指定所使用的动态库 -l:库名 -L:库路径
gcc test.c -o a.out -lmymath -L.lib
4、运行可执行文件 ./ 但是会出错
原因:链接器:工作于链接阶段 工作时需要 -l -L
动态链接器:工作于程序运行阶段,工作时需要提供动态库所在的位置
通过环境遍历:export LD_LIBRARY_PATH = 动态库路径 ./成功
如果要长期有效,需要写入终端配置文件 .bashrc
gdb调试工具
gcc -g 使用该参数编译可执行文件,得到调试表
gdb a.out
list 1:从第一行开始列出源码
b: b 20 在20行设置断点
run : r 执行程序,到断点 n 下一条指令 s 步入
p : 查看变量的值
continue 继续执行之后指令
quit 退出gdb
使用run查找出段错误
Makefile项目管理
makefile实际上是脚本文件 命名 makefile Makefile
1个规则:
目标:依赖条件
(一个tab缩进)命令
eg.
hello:hello.c
gcc hello.c -o hello
第一组目标看成终极目标
2个函数:
wildcard:找到当前目录下所有后缀为.c的文件,赋值给src
src = $(wildcard *.c)
patsubst:把src变量里所有后缀为.c的替换成.o
将参数3中包含参数1的部分替换成参数2
obj = $(patsubst %.c, %.o, $(src));
clean 无依赖
clean:
-rm -rf $(obj) a.out
3个自动变量:
$@:在规则的命令中表示规则中的目标,只能出现在命令中
$^:在规则的命令中表示所有依赖条件
$<:在规则的命令中表示第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列别中的依赖依次取出,套用模式规则。
模式规则:
%.o:%.c
gcc $< -o $@;
静态模式规则:
$(obj):%.o:%.c
gcc $< -o $@;
伪目标: .PHONY:clean ALL