Linux基础环境开发工具gcc/g++ make/Makefile git

1.Linux编译器-gcc/g++使用

1. 预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,后面是编译好的文件名 “.i”文件为已经过预处理的C原始程序

[wws@hcss-ecs-d531 ~]$ vim hello.c
[wws@hcss-ecs-d531 ~]$ gcc -E hello.c -o hello.i
[wws@hcss-ecs-d531 ~]$ cat hello.i

2.编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s

[wws@hcss-ecs-d531 ~]$ gcc -S hello.i -o hello.s
[wws@hcss-ecs-d531 ~]$ vim hello.s

3.汇编(生成机器可识别代码)

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

[wws@hcss-ecs-d531 ~]$ gcc -c hello.s -o hello.o
[wws@hcss-ecs-d531 ~]$ vim hello.o

4.连接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello

生成可执行文件hello

函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用.

函数库一般分为静态库和动态库两种。
1.静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了其后缀名一般为“.a”
2.动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcchello.o –o hello

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

gcc -o code_static code.s -static 用static选项链接静态库

yum install -y glibc-static 安装静态库C

yum install -y libstdc++-static  C++静态库

2. Linux项目自动化构建工具-make/Makefile

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

makefile使用

首先先创建两个文件 code.c makefile

-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile



-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile
-bash-4.2$ vim code.c
-bash-4.2$ vim makefile
//编译生成可执行程序code
-bash-4.2$ make
gcc -o code code.c
-bash-4.2$ ll
total 20
-rwxrwxr-x 1 wws wws 8360 Aug 19 11:26 code
-rw-r--r-- 1 wws wws   81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws   64 Aug 19 11:19 makefile
-bash-4.2$ ./code
hello Makefile!
//删除code
-bash-4.2$ make clean
rm -f code
-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile

makefile原理

我们先了解一下各行代码作用

1.code(目标文件 要生成的文件):code.c (依赖文件列表 可以有多个文件)

                  gcc -o code code.c 

依赖关系:

(Tab键)依赖方法

2. .PHONY(声明一个伪目标):clean(伪目标名称)

     clean:(依赖文件列表为空)

                 rm -f code (要生成clean文件,就要执行它的依赖方法。但它的依赖方法不会生成文件,只是执行了删除文件的操作)

了解了这些我们看看几个问题

1.为什么make 就可以直接生成code文件呢?

(1)makefile文件会被make从上到下扫描,第一个目标名是缺省形成的。执行其他组的依赖关系和依赖方法,make+目标名。

把clean放第一个位置也可以make 默认执行。但不建议

2.PHONY:clean 有什么作用?

让目标文件的依赖方法每次都可执行。

-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile
-bash-4.2$ make
gcc -o code code.c
-bash-4.2$ make
make: `code' is up to date.
-bash-4.2$ make
make: `code' is up to date.
-bash-4.2$ make
make: `code' is up to date.

可以看到code:code.c 执行一次就不能执行了。

当我们给code加上.PHONY后,

-bash-4.2$ vim makefile
-bash-4.2$ make
gcc -o code code.c
-bash-4.2$ make
gcc -o code code.c
-bash-4.2$ make clean
rm -f code
-bash-4.2$ make clean
rm -f code
-bash-4.2$ make clean
rm -f code

3.可以看到code:code.c可以被多次执行了,但为什么clean: 也可以被多次执行呢?

 让我们先修改一下makefile文件

首先我们要明白什么时候要重新编译文件,当然是文件内容被修改的时候。

根据对比code.c 和 code的Mtime(Modify)就可以判断文件内容有没有被修改。

.PHONY就是忽略Mtime时间的对比,来让目标文件的依赖方法每次都可执行。

stat 查看文信息

-bash-4.2$ ll
total 20
-rwxrwxr-x 1 wws wws 8360 Aug 19 12:32 code
-rw-r--r-- 1 wws wws   81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws   63 Aug 19 12:32 makefile
//stat 查看文件的详细信息
-bash-4.2$ stat code.cFile: ‘code.c’Size: 81              Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1703942     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     wws)   Gid: ( 1000/     wws)
//Access 文件最近访问时
Access: 2024-08-19 11:23:32.023200919 +0800
//Modify 最新文件内容被修改的时间
Modify: 2024-08-19 11:20:19.100243259 +0800
//Change 最新文件属性被修改的时间
Change: 2024-08-19 11:20:19.102243300 +0800Birth: -
-bash-4.2$ stat codeFile: ‘code’Size: 8360            Blocks: 24         IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1703940     Links: 1
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/     wws)   Gid: ( 1000/     wws)
Access: 2024-08-19 12:32:42.882419012 +0800
Modify: 2024-08-19 12:32:42.882419012 +0800
Change: 2024-08-19 12:32:42.882419012 +0800Birth: -

让我们修改code.c文件的内容(因为文件属性也包含文件大小,内容改变,文件属性也会改变,所以Ctime和Mtime会一起改变)

-bash-4.2$ vim code.c
-bash-4.2$ stat code.cFile: ‘code.c’Size: 180             Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1703950     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     wws)   Gid: ( 1000/     wws)
Access: 2024-08-19 12:38:49.429946666 +0800
Modify: 2024-08-19 12:38:49.429946666 +0800
Change: 2024-08-19 12:38:49.431946707 +0800Birth: -
-bash-4.2$ stat codeFile: ‘code’Size: 8360            Blocks: 24         IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1703940     Links: 1
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/     wws)   Gid: ( 1000/     wws)
Access: 2024-08-19 12:32:42.882419012 +0800
Modify: 2024-08-19 12:32:42.882419012 +0800
Change: 2024-08-19 12:32:42.882419012 +0800Birth: -

可以看到code.c的Mtime的时间在code Mtime的后面,说明code的内容已经不是最新的,就可以make 重新编译。

-bash-4.2$ make
gcc -o code code.c
-bash-4.2$ stat codeFile: ‘code’Size: 8360            Blocks: 24         IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1703940     Links: 1
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/     wws)   Gid: ( 1000/     wws)
Access: 2024-08-19 12:41:24.546132682 +0800
Modify: 2024-08-19 12:41:24.546132682 +0800
Change: 2024-08-19 12:41:24.546132682 +0800Birth: -

最后回到为什么clean:可以重复执行,就是因为clean:的依赖方法rm没有时间概念,所以可以重复执行。

4.我们想输出1111,但不想输出echo "1111"(echo 和字符间的空格不能省),怎么关闭命令回显呢?

可以用前加@关闭

-bash-4.2$ make
echo "1111"
1111
echo "1111"
1111
echo "1111"
1111
echo "1111"
1111
gcc -o code code.c

-bash-4.2$ make
1111
1111
1111
1111
gcc -o code code.c

虽然看着只是用了一行代码就实现了对code.c的编译,其实展开来说这是一个递归实现的过程。

(2)make解析makefile时,如果code所依赖的code.o文件不存在,那么make会在当前文件中找目标为code.o文件的依赖性,以此类推,直到如找到再自下而上生成code(这有点像一个堆栈的过程)

-bash-4.2$ vim makefile
-bash-4.2$ make
gcc -E code.c -o code.i
gcc -S code.i -o  code.s
gcc -c code.s -o  code.o
gcc code.o -o code
-bash-4.2$ ll
total 48
-rwxrwxr-x 1 wws wws  8360 Aug 20 10:37 code
-rw-r--r-- 1 wws wws   180 Aug 19 12:59 code.c
-rw-rw-r-- 1 wws wws 16978 Aug 20 10:37 code.i
-rw-rw-r-- 1 wws wws  1680 Aug 20 10:37 code.o
-rw-rw-r-- 1 wws wws   538 Aug 20 10:37 code.s
-rw-rw-r-- 1 wws wws   205 Aug 20 10:37 makefile
-bash-4.2$ ./code
hello Makefile!
hello Makefile!
hello Makefile!
hello Makefile!
-bash-4.2$ make clean
rm -f code.i code.s code.o code
-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 180 Aug 19 12:59 code.c
-rw-rw-r-- 1 wws wws 205 Aug 20 10:37 makefile

makefile语法

1.% 通配符 $<

%.c 把当前目录中后缀.c文件放入依赖文件列表

$< :将依赖文件列表的文件一个一个交给gcc -c 配合 %.o生成同名的.o文件

2.定义变量名

我们可以给目标文件 依赖文件列表定义变量名。

$( ) 用来标记里面内容是变量名,不是文件。

3.$^ $@

$^:代表依赖文件列表 

$@:代表目标文件

(3)make默认只生成一个可执行程序

-bash-4.2$ ll
total 12
-rw-rw-r-- 1 wws wws 112 Aug 20 11:40 code.c
-rw-rw-r-- 1 wws wws 181 Aug 20 12:13 makefile
-rw-rw-r-- 1 wws wws  51 Aug 20 12:12 test.c
-bash-4.2$ make
gcc code.c -o code
-bash-4.2$ ll
total 24
-rwxrwxr-x 1 wws wws 8360 Aug 20 12:03 code
-rw-rw-r-- 1 wws wws  112 Aug 20 11:40 code.c
-rw-rw-r-- 1 wws wws 181 Aug 20 12:13 makefile
-rw-rw-r-- 1 wws wws  51 Aug 20 12:12 test.c

可以看到上面这种写法只生成了一个可执行程序,怎么才能生成两个呢?
我们可以用原理(2),让make默认生成all目标文件,生成all又需要实现依赖文件列表$(bin1) $(bin2) , 实现后all文件什么都不用做,就可以同时生成多个可执行程序。

-bash-4.2$ make
gcc code.c -o code
gcc test.c -o test
-bash-4.2$ ll
total 36
-rwxrwxr-x 1 wws wws 8360 Aug 20 12:13 code
-rw-rw-r-- 1 wws wws  112 Aug 20 11:40 code.c
-rw-rw-r-- 1 wws wws  181 Aug 20 12:13 makefile
-rwxrwxr-x 1 wws wws 8360 Aug 20 12:13 test
-rw-rw-r-- 1 wws wws   51 Aug 20 12:12 test.c

补充:回车/换行 缓冲区

首先回车和换行是同一个东西吗?
回车是把光标移动到一行的开头位置,换行是把光标从当前位置向下移一格,到下一行。

平时我们写程序\n 就是先进行回车再进行换行。

这与缓冲区有什么关系呢?

这两段代码生成的程序有什么不同吗?

很明显,第二段代码输出hello后不会换行。但除此以外第一段代码hello是一开始就会输出,但第二段代码会先等2秒再输出。

编译器肯定是自上而下来读代码,printf("hello")后hello去哪了?
其实它是被存在缓冲区了,只不过\n可以立刻输出缓冲区的内容,立刻输出hello。第二段代码没有\n,只能等代码结束或者缓冲区满后输出。

如果我们想让第二段代码缓冲区内容立刻输出,有什么办法吗?

可以加上fflush(stdout)可以立即将缓冲区内容刷新到输出设备。

注意下面代码输出 i 后进行\r回车操作,下一次输出时就会覆盖原位置内容。

但如果覆盖完后,后面还有上次留下的内容,就会连同新内容一起输出。

比如说上面输出10,经过回车操作,下次输出的9会覆盖1的位置,但后面0仍存在,导致后面一直有0。

-2%d 输出两位并左对齐进行解决

3.Linux上git的简单使用

1.git clone 同步仓库

复制仓库链接

git clone

-bash-4.2$ git clone https://gitee.com/laiyue-ang/gitee_test.git
Cloning into 'gitee_test'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
-bash-4.2$ ll
total 24
-rwxrwxr-x 1 wws wws 8552 Aug 20 21:12 code
-rw-rw-r-- 1 wws wws  195 Aug 20 21:12 code.c
drwxrwxr-x 3 wws wws 4096 Aug 23 10:06 gitee_test //git仓库
-rw-rw-r-- 1 wws wws   89 Aug 20 19:46 makefile

2.git add 将文件填入暂存区

git status  命令用于显示当前仓库的状态。

1.工作目录的状态,包括哪些文件已被修改但尚未提交,哪些文件被新创建但未被跟踪(未添加到暂存区),以及哪些文件被删除但尚未从 Git 中删除。

2.提交的状态,显示哪些更改已经被暂存(准备提交),哪些更改还在工作目录中待处理。

3.当前所在的分支。

-bash-4.2$ cd gitee_test
-bash-4.2$ ls -al
total 24
drwxrwxr-x 3 wws wws 4096 Aug 23 10:06 .
drwx------ 5 wws wws 4096 Aug 23 10:06 ..
drwxrwxr-x 8 wws wws 4096 Aug 23 10:16 .git
-rw-rw-r-- 1 wws wws  270 Aug 23 10:06 .gitignore
-rw-rw-r-- 1 wws wws  954 Aug 23 10:06 README.en.md
-rw-rw-r-- 1 wws wws 1315 Aug 23 10:06 README.md
-bash-4.2$ touch test.c
-bash-4.2$ ll
total 8
-rw-rw-r-- 1 wws wws  954 Aug 23 10:06 README.en.md
-rw-rw-r-- 1 wws wws 1315 Aug 23 10:06 README.md
-rw-rw-r-- 1 wws wws    0 Aug 23 10:17 test.c
//显示当前仓库的状态
-bash-4.2$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test.c
nothing added to commit but untracked files present (use "git add" to track)
//添加到暂存区
-bash-4.2$ git add test.c

3.git commit -m "" 提交暂存区中的更改

git commit -m " "用于提交暂存区中的更改,并附上一个提交信息。双引号内的内容是提交信息的描述。

-bash-4.2$ git commit -m "第一次提交"
//ip地址 25是文件夹名称
[master 258e71f] 第一次提交1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 test.c
-bash-4.2$ ls -al
total 24
drwxrwxr-x 3 wws wws 4096 Aug 23 10:17 .
drwx------ 5 wws wws 4096 Aug 23 10:37 ..
drwxrwxr-x 8 wws wws 4096 Aug 23 10:37 .git
-rw-rw-r-- 1 wws wws  270 Aug 23 10:06 .gitignore
-rw-rw-r-- 1 wws wws  954 Aug 23 10:06 README.en.md
-rw-rw-r-- 1 wws wws 1315 Aug 23 10:06 README.md
-rw-rw-r-- 1 wws wws    0 Aug 23 10:17 test.c
-bash-4.2$ cd .git
-bash-4.2$ ll
total 48
drwxrwxr-x  2 wws wws 4096 Aug 23 10:06 branches
-rw-rw-r--  1 wws wws   16 Aug 23 10:37 COMMIT_EDITMSG
-rw-rw-r--  1 wws wws  268 Aug 23 10:06 config
-rw-rw-r--  1 wws wws   73 Aug 23 10:06 description
-rw-rw-r--  1 wws wws   23 Aug 23 10:06 HEAD
drwxrwxr-x  2 wws wws 4096 Aug 23 10:06 hooks
-rw-rw-r--  1 wws wws  336 Aug 23 10:19 index
drwxrwxr-x  2 wws wws 4096 Aug 23 10:06 info
drwxrwxr-x  3 wws wws 4096 Aug 23 10:06 logs
drwxrwxr-x 11 wws wws 4096 Aug 23 10:37 objects
-rw-rw-r--  1 wws wws  107 Aug 23 10:06 packed-refs
drwxrwxr-x  5 wws wws 4096 Aug 23 10:06 refs
-bash-4.2$ tree ./objects
./objects
├── 25
│   ├── 8e71faf534add8afe42bf5e88440936aa69f7f//test.c位置
│   └── 9148fa18f9fb7ef58563f4ff15fc7b172339fb
├── 2d
│   └── 5ccf81edf9d9f9578c41f8b2a4110657ddc8df
├── 3f
│   └── 86c0d12b09bace072229aa7db4ac3b7a85417c
├── 6f
│   └── 3f67da11058ebd2e861d41a6a441aa42d52936
├── 80
│   └── e5d64921976fbad64fd69f228054885ded9499
├── 8e
│   └── 2edac5f5d7121216dc874c5d1180c3ba1609eb
├── e6
│   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
├── info
└── pack

4.git push 提交到远程仓库

-bash-4.2$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:git config --global push.default matchingTo squelch this message and adopt the new behavior now, use:git config --global push.default simpleSee 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)Username for 'https://gitee.com': 18553792819
Password for 'https://18553792819@gitee.com': 
Everything up-to-date

5.git log 获取提交记录

-bash-4.2$ git log
commit 9eea2d72ad6673f512f6393880bba12bbe4b25e7
Author: @laiyue-ang <3190290400@qq.com>
Date:   Fri Aug 23 10:46:59 2024 +0800修改test.ccommit 258e71faf534add8afe42bf5e88440936aa69f7f
Author: @laiyue-ang <3190290400@qq.com>
Date:   Fri Aug 23 10:37:39 2024 +0800第一次提交commit 3f86c0d12b09bace072229aa7db4ac3b7a85417c
Author: 莱月昂 <13998474+laiyue-ang@user.noreply.gitee.com>
Date:   Fri Aug 23 02:00:23 2024 +0000Initial commit

补充:.gitignore

文件用于指定哪些文件和目录应该被 Git 忽略,不进行版本控制。你可以在.gitignore文件中列出要忽略的文件和目录,每行一个规则。

*.d会忽略所有以.d结尾的文件。push时不接收.d文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构】---二叉树OJ

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 相同的树另一颗树的子树翻…

linux死锁问题和cpu使用率过高问题排查

1、问题共同点 死锁问题和cpu使用率过高都是需要我们找出对应的问题线程。 死锁问题需要我们找出哪两个线程出现了死锁情况。 cpu使用率过高需要我们找出哪个或哪些线程占用了大量的cpu。 2、命令排查 2.1、查看机器上的Java进程 jcmd或 jps2.2、查看对应Java进程的线程级别…

五子棋理解C++思想

双人五子棋项目目录&#xff1a; class Game { public:Game();void init();bool waitPlayerPutChess(Player* player, int& oldi, int& oldj);void draw();void play();bool isOver(int playerId);public:int whoWin -1; // 谁赢了&#xff08;0&#xff1a;白棋&a…

科创中心“核”动力|趋动科技:AI算力界的领跑者

近日&#xff0c;趋动科技与深信服正式推出联合解决方案。联合解决方案将深信服EDS的高性能存储与趋动科技OrionX AI算力资源池化软件、以及GeminiAI训练平台有机结合&#xff0c;整合存力与算力资源的同时&#xff0c;帮助用户建好AI平台、管好AI资源、用好AI服务。 双方已完成…

Web3链上聚合器声呐已全球上线,开启区块链数据洞察新时代

在全球区块链技术高速发展的浪潮中&#xff0c;在创新发展理念的驱动下&#xff0c;区块链领域的工具类应用备受资本青睐。 2024年8月20日&#xff0c;由生纳&#xff08;香港&#xff09;国际集团倾力打造的一款链上应用工具——“声呐链上聚合器”&#xff0c;即“声呐链上数…

Facebook的区块链战略:如何在社交媒体中实现去中心化

随着区块链技术的发展&#xff0c;Facebook&#xff08;现Meta&#xff09;正积极探索如何将这一技术整合进其社交平台中&#xff0c;以提升用户体验和数据安全。区块链技术以去中心化、透明性和不可篡改性为特点&#xff0c;为社交媒体带来了新的可能性。本文将探讨Facebook在…

嵌入式和单片机有什么区别?

目录 &#xff08;1&#xff09;什么是嵌入式&#xff1f; &#xff08;2&#xff09;什么是单片机&#xff1f; &#xff08;3&#xff09;嵌入式和单片机的共同点 &#xff08;4&#xff09;嵌入式和单片机的区别 &#xff08;1&#xff09;什么是嵌入式&#xff1f; 关…

Linux云计算 |【第二阶段】SECURITY-DAY1

主要内容&#xff1a; 监控基础&#xff08;系统监控命令、监控软件&#xff09;、Zabbix监控服务端部署、Zabbix监控客户端部署、创建监控主机、调用监控模板、自定义key、创建模板、应用集、监控项、绑定模板&#xff1b; 一、监控概述 1&#xff09;监控的目的 ① 实时报…

【Hot100】LeetCode—114. 二叉树展开为链表

目录 1- 思路技巧——借助指针 2- 实现⭐114. 二叉树展开为链表——题解思路 3- ACM 实现 原题连接&#xff1a;114. 二叉树展开为链表 1- 思路 技巧——借助指针 思路&#xff1a;通过 ① 将左子树的右下结点的 .next ——> 拼接到当前节点的右子树上。 构造 cur 指针&a…

数据结构【链试结构二叉树】

&#x1f31f;个人主页&#xff1a;落叶 目录 ​编辑 实现链式结构⼆叉树 前中后序遍历&#xff1a; 遍历规则 代码实现 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 图解遍历&#xff1a; 函数递归栈帧图&#xff1a; 结点个数以及高度等 【⼆…

每日OJ_牛客_淘宝网店(日期模拟)

目录 牛客_淘宝网店&#xff08;日期模拟&#xff09; 解析代码 牛客_淘宝网店&#xff08;日期模拟&#xff09; 淘宝网店__牛客网 解析代码 这是一个变相的日期计算器。只不过2、3、5、7、11月算1天&#xff0c;其他7个月算2天。 既然是一个变相的日期计算器&#xff0c;那…

基于STM32开发的智能空气质量监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化空气质量监测与处理风扇控制与状态显示Wi-Fi通信与远程监控应用场景 家庭和办公室的空气质量监测室内空气净化器的智能控制常见问题及解决方案 常见问题解决方案结论 1. 引言 空气…

单位信息宣传考核投稿方法不对让我尝尽了苦头

自从我担任单位的信息宣传员以来,便深刻体会到“信息宣传”四个字背后的重量。每月的信息宣传考核任务就像一座大山,压在我心头。起初,我像大多数同行一样,习惯于通过电子邮件向各大媒体投稿,但这种方式让我尝尽了苦头。 记得开始尝试通过邮箱投稿时,我满怀信心地将精心准备的文…

web前端之选项卡集合、动态添加类名、动态移除类名、动态添加样式、激活、间距、节流、tabBar

MENU input的checked属性(HtmlStyle)伪元素(HtmlStyleJavaScript)激活类(HtmlStyleJavaScript)vue伪元素 input的checked属性(HtmlStyle) 前言 代码段创建一个使用HTML和CSS实现的标签式内容切换组件。通过选择不同的标签&#xff0c;可以展示相应的内容。 代码段实现一个简洁…

02 tkinter有趣项目-头像制作-界面设计

头像制界面设计 avatar.png 界面 界面分析 背景图片: 顶部中央位置显示一个小孩背着书包的图片。这个图片是程序的背景&#xff0c;占据了大部分的窗口空间。 标题和按钮: 在图片上方&#xff0c;有一个标题栏&#xff0c;显示文本“在线姓氏头像制作”&#xff0c;使用隶书字…

redis面试(二十)读写锁WriteLock

写锁WriteLock 和读锁一样&#xff0c;在这个地方执行自己的lua脚本&#xff0c;我们去看一下 和read没有多大的区别 KEYS[1] anyLock ARGV[1] 30000 ARGV[2] UUID_01:threadId_01:write hget anyLock mode&#xff0c;此时肯定是没有的&#xff0c;因为根本没这个锁 …

“双指针”算法下篇

WeChat_20240806081335 对双指针这一思想在OJ 里面的相关应用&#xff0c;感兴趣的友友们&#xff0c;可以看下此篇博客 https://blog.csdn.net/X_do_myself/article/details/141291451?spm1001.2014.3001.5502 目录 一盛最多水的容器 1题目链接&#xff1a;盛最多水的容器…

音频分割软件有什么?最方便的音频分割软件分享给你

一段长音频就像是一本厚重的百科全书&#xff0c;而音频剪辑师的任务&#xff0c;就是要将这本书拆分成数个章节&#xff0c;每章都有其独立的主题和内容&#xff0c;这非常考验剪辑师们的音频分割技巧。 幸运的是&#xff0c;随着技术的发展&#xff0c;市面上出现了许多优秀…

微信小程序引入全局环境变量

有时候一套代码要在多个小程序appId下使用,其中又有一些数据(文字)需要做区分.可以使用下面的方法 把要配置的数据以export default 形式导出 在app.js中,引入project.config.0.js文件,将导出的数据放在globalData中 在页面目录中,即可利用getApp()方法使用全局变量 也可以放数…

剪辑视频的软件在手,温馨瞬间秒变电影级大片

在现在这个啥都能数字化的年代&#xff0c;家里拍的视频成了咱们记录生活、留下美好回忆的好办法。不过&#xff0c;好多人可能就只是随便拍拍&#xff0c;然后直接发出去&#xff0c;没想过用专业的剪辑视频的软件来搞一搞&#xff0c;让自己的视频更有感觉&#xff0c;看起来…