规划
实际
10:00起床
12:20-12:40学习0.3h
13:20-14:20学习1h
14:40学习-17:30学习3h
19:30-22:00学习2.5h
共:6.8h
MakeFile学习
Makefile:是用来管理项目工程文件
更新规则
如果所有依赖文件生成时间比目标文件的时间早,则不更新
若有一个依赖文件在目标文件创建后有更改,则重新执行该命令
变量
普通变量
自定义变量
makefile自带的变量
CC = gcc #arm-linux-gcc
CPPFLAGS : C预处理的选项 -I
CFLAGS: C编译器的选项 -Wall -g -c
LDFLAGS : 链接器选项 -L -l
自动变量(只能在命令中调用)
$@: 表示规则中的目标
$<: 表示规则中的第一个条件
$^: 表示规则中的所有条件, 组成一个列表, 以空格隔开, 如果这个列表中有重复的项则消除重复项。
模式规则
‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的取值取决于其目标:
比如: main.o:main.c fun1.o: fun1.c fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c
函数
wildcard
查找指定目录下的指定类型的文件
src=$(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src
patsubst
匹配替换
obj=$(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o
伪目标
伪目标声明:
.PHONY:目标名
声明目标为伪目标之后, makefile将不会检查该目标是否存在或者该目标是否需要更新
默认 第一个目标是终极目标,make不加参数默认 执行第一个目标
继续执行下一个命令
命令前加一个 -,如果该命令报错依然向下执行
makefile改名
make -f makefile文件名
Linux基础
动态库
程序编译时不会被链接,运行时才被载入
优点:
多个运行应用都要调用该库函数时,内存中只存在一个共享库,避免空间浪费
运行时载入,避免像静态库更新对程序的更新、部署带来的麻烦,仅更新动态库即可。
名称:libtest2.so
lib+库名称+.so
制作
gcc -fpic -c fun1.c fun2.c #1. 生成目标文件.o
# 参数:-fpic创建与地址无关的编译程序(pic, position independent code), 目的就是为了能够在多个应用程序间共享.
gcc -shared fun1.o fun2.o -o libtest2.so # 2. 生成共享库
# -shared(指定生成动态链接库)
nm命令
nm命令是linux下针对某些特定文件的分析工具,能够列出库文件(.a、.lib)、目标文件(*.o)、可执行文件的符号表。
ldd命令
在linux中, ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。
file命令
查看文件类型
找不到动态库
Ø 对于elf格式的可执行程序,是由ld-linux.so*来完成的, 它先后搜索
elf文件的 DT_RPATH段 —
环境变量LD_LIBRARY_PATH —
/etc/ld.so.cache文件列表 —
/lib/, 全局lib
/usr/lib目录 (用户lib)找到库文件后将其载入内存。
临时加入动态库
export LD_LIBRARY_PATH=~/work/linuxlearn/t1/
永久加入
sudo cp libtest2.so /usr/lib/
链接器和动态加载器不一样
-L
编译时指定库路径
ldd命令
查看文件依赖的动态库,运行时加载,需要设置动态库路径
注意:
这2个路径没有关系,需要不同的指定
2维动态规划
确定dp数组(dp table)以及下标的含义
布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
确定递推公式
当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。
当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况
情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
情况二:下标i 与 j相差为1,例如aa,也是文子串
情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。
class Solution {
public:
int dp[1004][1004];
string longestPalindrome(string s) {
int n=s.size();
int x=0,y=0;
for(int i=0;i<n;i++){
for(int j=i;j>=0;j--){
if(s[i]!=s[j]){ //首尾不同,必不行
dp[i][j]=0;
}else{
if(i==j || abs(i-j)==1 || dp[i-1][j+1]==1){// i==j时,i和j相邻且相等时,i-1和j+1相等时且是s[i]==s[j]
dp[i][j]=1;
if(abs(i-j)>abs(x-y)){
x=i,y=j;
}
}else{
dp[i][j]=0;
}
}
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<n;j++){
// cout<< dp[i][j]<<'\t';
// }
// cout<< endl;
// }
// cout<< x<<'-'<<y;
return s.substr(y,x-y+1);
}
};
计算机网络
网络层
运输层
UDP协议
TCP协议