Administrator
发布于 2023-09-27 / 6 阅读 / 0 评论 / 0 点赞

9月27日

规划

实际

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

16-C库函数和系统函数的关系_哔哩哔哩_bilibili

MakeFile学习

Makefile教程和示例指南 (foofun.cn)

Makefile:是用来管理项目工程文件

更新规则

如果所有依赖文件生成时间比目标文件的时间早,则不更新

若有一个依赖文件在目标文件创建后有更改,则重新执行该命令

变量

普通变量

  1. 自定义变量

  2. 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*来完成的, 它先后搜索

  1. elf文件的 DT_RPATH段

  2. 环境变量LD_LIBRARY_PATH

  3. /etc/ld.so.cache文件列表

  4. /lib/, 全局lib

  5. /usr/lib目录 (用户lib)找到库文件后将其载入内存。

临时加入动态库

export LD_LIBRARY_PATH=~/work/linuxlearn/t1/

永久加入

sudo cp libtest2.so /usr/lib/ 
链接器和动态加载器不一样

-L

编译时指定库路径

ldd命令

查看文件依赖的动态库,运行时加载,需要设置动态库路径

注意:

这2个路径没有关系,需要不同的指定

2维动态规划

5. 最长回文子串 - 力扣(LeetCode)

  1. 确定dp数组(dp table)以及下标的含义

布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

  1. 确定递推公式

当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协议


评论