Linux——基础开发工具(上)

作者:进击的荆棘日期:2026/7/31

💁‍♂️个人主页:进击的荆棘

👇作者其它专栏:

《数据结构与算法》《算法》《C++起始之路》《Linux》


目录

1.软件包管理器

2.编辑器Vim

3.编译器gcc/g++

4.自动化构建--make/Makefile

5.Linux第一个系统程序--进度条

6.版本控制器Git

7.调试器-gdb/cgdb使用


1.软件包管理器

1.1什么是软件包

●在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。

●但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。

●软件包和软件包管理器,就好比“APP”和“应用商店”的关系。

●yum(Yellow dog Updater,Modified)是Linux下非常常用的一种包管理器。主要应用在Fedora,RedHat,Centos等发行版上。

●Ubuntu:主要使用apt(Advanced Package Tool)作为其包管理器。apt同样提供了自动解决依赖关系、下载和安装软件包的功能。

1.2Linux软件生态

●Linux下载软件的过程(Ubuntu、Centos、other)

●操作系统的好坏评估——生态问题

●为什么会有人免费特定社区提供软件,还发布?还提供云服务器让你下载?

●软件包依赖的问题

●国内镜像源

发行版镜像站软件源地址 (示例)
Ubuntu阿里云https://mirrors.aliyun.com/ubuntu/
清华 (TUNA)https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
中科大 (USTC)https://mirrors.ustc.edu.cn/ubuntu/
腾讯云https://mirrors.tencent.com/ubuntu/
Debian阿里云https://mirrors.aliyun.com/debian/
清华 (TUNA)https://mirrors.tuna.tsinghua.edu.cn/debian/
中科大 (USTC)https://mirrors.ustc.edu.cn/debian/
官方中国镜像http://ftp.cn.debian.org/
CentOS / Rocky Linux阿里云 (CentOS 7)https://mirrors.aliyun.com/repo/Centos-7.repo
阿里云 (CentOS 8/6 存档)https://mirrors.aliyun.com/repo/Centos-vault-{版本号}.repo
华为云 (CentOS)https://repo.huaweicloud.com/centos/
腾讯云 (CentOS 存档)https://mirrors.tencent.com/centos-vault/

sudo yum install -y epel-release

1.3yum具体操作

1.3.1查看软件包

通过yum list命令可以罗列出当前一共有哪些软件包。由于包的数目可能非常之多,需要使用grep命令只筛选出关注的包。例如:

1//Centos
2[root@VM-0-6-centos ~]# yum list | grep lrzsz
3Repository epel is listed more than once in the configuration
4lrzsz.x86_64                             0.12.20-36.el7                @os    

注意事项:

●软件包名称:主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构

●“x86_64”后缀表示64位系统的安装包,“i686”后缀表示32位系统安装包。选择包时要和系统匹配

●“el7”表示操作系统发行版的版本。“el7”表示centos7/redhat7。“el6”表示centos6/redhat6

●最后一列,base表示“软件源”的名称,类似“应用商店”的概念

1.3.2安装软件

使用yum,可以通过很简单的一条命令完成gcc的安装。

1//Centos
2$ sudo yum install -y lrzsz
3
4//Ubuntu
5$ sudo apt install -y lrzsz

●yum/apt会自动找到都有哪些软件需要下载,这时候敲“y”确认安装

●出现“complete”字样或中间未出现报错,说明安装完成

注意:

●安装软件时由于选哟向系统目录中写入内容,一般需要sudo或切换到root账户下才能完成。

●yum/apt安装软件只能一个装完在装另一个。正在yum/apt安装一个软件的过程中,若再尝试用yum/apt安装另一个软件,yum/apt会报错。

1.3.3卸载软件

仍然是一条命令:

1//Centos
2sudo yum remove [-y] lrzsz
3
4//Ubuntu
5sudo apt remove [-y] lrzsz

1.3.4注意事项

关于yum/apt的所有操作必须保证主机(虚拟机)网络畅通!

可以通过ping指令验证

ping www.baidu.com

1.4安装源

Centos安装源路径:

1[root@VM-0-6-centos ~]# ll /etc/yum.repos.d
2total 16
3-rw-r--r-- 1 root root  641 Mar 20 22:53 CentOS-Base.repo    //标准源
4-rw-r--r-- 1 root root 1358 Sep  5  2021 epel.repo    //扩展源
5
6

Ubuntu安装源路径:

1cat /etc/apt/sources.list    //标准源
2ll /etc/apt/sources.list.d    //扩展源

云服务器的软件源已经镜像过了,即都是国内的。

2.编辑器Vim

●IDE例子

2.1Linux编辑器-vim使用

vi/vim的区别简单来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、mac os、windows。

2.2vim的基本概念

vim有三种常用的模式,分别是命令模式(command mode)、插入模式(insert mode)和底行模式(last line mode),各模块功能区分如下:

●正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或到last line mode

●插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按【ESC】键可回到命令模式。该模式是最频繁使用的模式。按i进入

●底行模式(Last line mode)

文件报存或退出,也可以进行文件替换,找字符串,列出行号等操作。

在命令模式下,“shift+;”即可进入该模式。要查看你的所有模式:打开vim,低行模式直接输入:help vim-modes

共有12种模式:six BASIC modes和six ADDITIONAL modes

2.3vim的基本操作

●进入vim,在提供提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:

$ vim test.c

//注意,进入vim后,处于[正常模式],要切换到[插入模式]才能输入文字

●[正常模式]切换至[插入模式]

●输入i(insert):

在光标当前字符前面开始输入。

●输入a(append):

在光标当前字符后开始输入

●输入o(open):

在当前行下方新开一行

●[插入模式]切换至[正常模式]

目前处于[插入模式],就只能一直输入文字,若发现输错了字,想用光标键往回移动,将该字删除,可以先按一下【ESC】键转换到[正常模式]再删除文字。也可以直接删除

●[正常模式]切换至[底行模式]

【shift+;】,其实就是输入【:】

●退出vim及报存文件,在[正常模式]下,按一下【:】冒号键进入【底行模式】,例如:

●:w(保存当前文件)

●:wq(输入【wq】,存盘并退出vim)

●:q!(输入q!,不存盘强制退出vim)

2.4vim正常模式命令集

●插入模式

按【i】切换进入插入模式【insert mode】,按“i”进入插入模式后是从光标当前位置开始输入文件;

按【a】进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

按【o】进入插入模式后,是插入新的一行,从行首开始输入文字。

●从插入模式切换到命令模式

按【ESC】键。

●移动光标

●vim可以直接用键盘上的上下左右键来上下左右移动,但正规的vim是用小写英文字母【h】、【j】、【k】、【l】,分别控制光标左、下、上、右移一格

●按【^】:移动到光标所在行的“行首”

●按【$】:移动到光标所在行的“行尾”

●按【w】:光标跳到下个字的开头

●按【b】:光标回到上个字的开头

●按【num+l】:光标移动到该行的第num个位置,如5l,26l

●按【gg】:进入到文本开始

●按【shift+g】:进入文本末端

●删除文字

●【x】:每按一次,删除光标所在位置的每一个字符

●【num+x】:【6x】表示删除光标所在位置的“后面(包含自身)”6个字符

●【X】:大写的X,每按一次,删除光标所在位置的“前面”一个字符

●【num+X】:【20X】表示删除光标所在位置的“前面

●【dd】:删除光标所在行

●【num+dd】:从光标所在行开始删除num行

●复制

●【yy】:复制光标所在行到缓冲区

●【num+yy】:【6yy】表示拷贝从光标所在的该行(包含该行)以下的6行文字

●【p】:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能

●替换

●【r】:r+想要的字符,就可以替换光标所在处的字符

●【shift+r】:批量替换所到之处的字符,知道按下【ESC】键为止

●撤销上一次操作

●【u/uu】:若误执行一个命令,可以马上按下【u/uu】,回到上一个操作。按多次“u/uu”可以多次回溯

●【ctrl+r】:可以撤销【u/uu】的回溯

●查找指定单词

【shift+3】:将光标移动到想要的单词后,按【shift+3】可以将所有的此单词高亮。进入底行模式后,输入noh可以取消高亮

【n】:在按下【shift+3】后,按【n】可以逆向查找

2.5vim底行模式命令集

在使用底行模式之前,确保当前处于正常模式,在按【shift+ ;】即可进入底行模式。

●列出行号

●【set nu】:输入【set nu】后,会在文件中每一行前面列出行号

●取消行号

●【set nonu】:输入【set nonu】后,会取消文件中的行号

●跳到文件中的某一行

●【num】:【num】表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,若输入数字15,再回车,就会跳到文字的第15行

●查找字符

●【/+关键字】:先按【/】键,再输入想寻找的字符,若第一次找的关键字不是想要的,可以按【n】往后寻找,直到找到想要的为止

●【?+关键字】:先按【?】键,再输入想寻找的字符,若第一次找的关键字不是想要的,可以按【n】往前寻找,直到找到想要的为止

●改变字符

●【%s/src/dst】:将指定字符串更改为想到的字符串,若想将hello更改为Linux,%s/hello/Linux

●打开其它文件

●【vs newfile】:在分出一块屏打开newfile文件(Ctrl+w w可在所有窗口中循环切换光标)

●保存文件

●【w】:在冒号输入字母【w】就可以将文件保存起来

●退出vim

●【q】:按【q】就是退出,若无法离开vim,可以在【q】后跟一个【! 】强制离开vim

●【wq】:一般离开时,与【w】共同使用,此时就会在退出的时候保存文件●

●执行Linux中的相关指令

●【!command】:例如按下【!+ls -al】,会在vim中执行ls -al命令

2.6vim操作总结

使用vim的技巧

●打开指定文件的行

vim src +n:打开src文件时,光标处于第n行

!v:进行上一次的vim操作

●三种模式

●正常模式

●插入模式

●底行模式

●vim操作

●打开,关闭,查看,查询,插入,删除,替换,撤销,复制等操作

2.7vim配置

配置文件的位置

●在目录/etc/下,有一个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效

●而在每个用户的主目录下,都可以自己建立私有的配置文件,命令为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,若不存在,则创建

●切换普通用户,进入自己的主工作目录

●打开当前用户的.vimrc文件,执行vim .vimrc

常用配置选项,用来测试

●设置语法高亮:syntax on

●显示行号 set nu

●设置缩进的空格数为4:set shiftwidth=4

VimForCpp: 快速将vim打造成c++ IDE

GitHub - wsdjeg/vim-galore-zh_cn: Vim 从入门到精通 · GitHub

3.编译器gcc/g++

3.1背景知识

1.预处理(进行宏替换/去注释/条件编译/头文件展开等)

2.编译(生成汇编)

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

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

3.2gcc编译选项

格式 gcc [选项] 要编译文件 [选项] [目标文件]

3.2.1预处理(进行宏替换)

●预处理功能主要包括宏定义,文件包含,条件编译,去注释等

●预处理指令是以#号开头的代码行

●实例:gcc -E hello.c -o hello.i

●选项“-E”,该选项的作用是让gcc在预处理结束后停止编译过程

●选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

3.2.2编译(生成汇编)

●在此阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言

●用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

●实例:gcc -S hello.i -o hello.s

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

●汇编阶段是把编译阶段生成的“.s”文件转成目标文件

●可使用选项“-c”就可以看到汇编代码已转化为“.o”的二进制目标代码

●实例:gcc -c hello.s -o hello.o

3.2.4链接(生成可执行文件或库文件)

●在成功编译后,就进入链接阶段

●实例:gcc hello.o -o hello

3.3动态链接和静态链接

在实际开发中,不可能将所有代码放在一个源文件中,所有会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个原文件可能要调用另一个原文件中定义的函数,但是每个源文件都是独立编译的,集每个*.c文件会形成一个*.o文件,为了满足依赖关系,就需要将这些源文件参审的目标文件进行链接,从而形成一个可执行的程序。这个链接的过程就是静态链接。静态链接的缺点很明显:

●浪费空间:因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以若多个程序对同一个目标文件都有依赖,如多个程序中都调用了printf() 函数,则这多程序中含有printf.o,所以同一个目标文件都在内存存在多个副本

●更新比较困难:因为每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。

动态链接的出现解决了静态链接中提到的问题。动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是想静态链接一样把所有程序模块都链接成一个单独的可执行文件。

动态链接其实远比静态链接要常用得多。比如查看code这个可执行程序依赖的动态库,会发现它就用到了一个c动态链接库:

1[sjx@VM-0-6-centos ~]$ ldd code
2	linux-vdso.so.1 =>  (0x00007ffd61194000)
3	libc.so.6 => /lib64/libc.so.6 (0x00007f8f9fca5000)
4	/lib64/ld-linux-x86-64.so.2 (0x00007f8fa0073000)
5
6//ldd命令用于打印程序或库文件所依赖的共享库列表

在此涉及到一个重要的概念:库

●自己写的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的?

●答案是:系统把这些函数都被实现在名为libc.so.6的库文件,在没有特别指定时,gcc会到系统默认的搜索路径“/usr/lib”下查找,也就是路径到libc.so.6库函数中去,这样就能实现函数“printf”,这就是链接的作用

3.4静态库和动态库

●静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

●动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所诉的libc.so.6就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下所示:gcc hello.o -o hello

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

注意:

●Linux下,动态库XXX.so,静态库XXX.a

●Windows下,动态库XXX.dll,静态库XXX.lib

一般云服务器,C/C++的静态库并没有安装,可以采用如下方法安装

//Centos

yum install glibc-static libstdc++-static -y

//Ubuntu

3.5gcc其它常用选项

●-E 只激活预处理,这个不生成文件,需要把它重定向到一个输出文件里

●-S 编译到汇编语言不进行汇编和链接

●-c 编译到目标代码

●-o 文件输出到文件

●-static 此选项对生成的文件采用静态链接

●-g 生成调试信息。GNU调试器可利用该信息

●-shared 此选项将尽量使用动态库,所以生成文件比较小

●-O0

●-O1

●-O2

●-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

●-w 不生成任何警告信息

●-Wall 生成所由警告信息

4.自动化构建--make/Makefile

4.1背景

●会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

●一个工程的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要现编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作

●makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大提高了软件开发的效率

●make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数IDE都有这个命令,如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile成为了一种在工程方面的编译方法

●**make是一个命令,makefile是一个文件,**两个搭配使用,完成项目自动化构建

4.2理解

makefile的基本概念——依赖关系,依赖方法

makefile:

1 code:code.c //依赖关系

2 gcc -o code code.c //依赖方法

4.3基本使用

示例代码

1#include <stdio.h>
2
3int main(){
4    printf("hello Makefile!\n");
5    return 0;
6}

Makefile文件

1mymproc:myproc.c
2    gcc -o myproc myproc.c
3
4.PHONY:clean
5clean:
6    rm -f myproc

依赖关系

**●**上面的文件myproc,它依赖myproc.c

依赖方法

**●**gcc -o myproc myproc.c,就是与之对应的依赖关系

项目清理

**●**工程是需要被清理的

**●**像clean这种,没有被第一个目标文件直接或间接关联,那么它后面定义的命令将不会被自动执行,不过,可以显示用make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译

**●**但是一般这种clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是,总是被执行的

**●**可将hello目标文件声明为伪目标,测试

什么叫做总是被执行?

1[sjx@VM-0-6-centos ~]$ stat myproc.c
2  File: ‘myproc.c’
3  Size: 74        	Blocks: 8          IO Block: 4096   regular file
4Device: fd01h/64769d	Inode: 655809      Links: 1
5Access: (0664/-rw-rw-r--)  Uid: ( 1001/     sjx)   Gid: ( 1001/     sjx)
6Access: 2026-07-27 17:51:03.184872832 +0800
7Modify: 2026-07-27 17:51:03.182872830 +0800
8Change: 2026-07-27 17:51:03.182872830 +0800
9 Birth: -
10
11文件=内容+属性
12Modify:内容变更,时间更新
13Change:属性变更,时间更新
14Access:常指的是文件最近一次被访问的时间。在Linux的早期版本中,每当文件被访问时,其atime都会更新。但这种机制会导致大量的IO操作。

结论:

.PHONY:让make忽略源文件和可执行目标文件的Modify时间对比

4.4推导过程

1myproc:myproc.o
2  gcc myproc.o -o myproc
3myproc.o:myproc.s
4  gcc -c myproc.s -o myproc.o
5myproc.s:myproc.i
6  gcc -S myproc.i -o myproc.s
7myproc.i:myproc.c
8  gcc -E  myproc.c -o myproc.i
9
10.PHONY:clean
11clean:
12  rm -f myproc *.i *.s *.o
13

编译

1$ make
2gcc -E myproc.c -o mypro.i
3gcc -S myproc.i -o mypro.s
4gcc -c myproc.s -o mypro.o
5gcc myproc.o -o mypro

●make是如何工作的,在默认的方式下,也就是指输入make命令。

1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件

2.若找到,它会找文件中的第一个目标文件(target),在上面的例子中,它会找到myproc这个文件,并把这个文件作为最终的目标文件

3.若myproc文件不存在,或是myproc所依赖的后面的myproc.o文件的文件修改时间要比myproc这个文件新,那么,它就会执行后面所定义的命令来剩下myproc文件

4.若myproc所依赖的myproc.o文件不存在,那么make会在当前文件中找目标为myproc.o文件的依赖性,若找到则再根据那一个规则生成myproc.o文件(有点像一个堆栈的过程)

5.于是make生成myproc.o文件,再用myproc.o文件声明make的终极任务,也就是执行文件hello

6.这就是整个make的依赖性,make会一层一层地去找文件的依赖关系,直到最终编译处第一个目标文件

7.在找寻的过程中,若出现文题,如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理

8.make只管文件的依赖性,即若在找到了依赖关系后,冒号后面的文件还是不存在,make还是不工作

4.5扩展语法

1BIN=proc.exe    #定义变量
2CC=gcc
3#SRC=$(shell ls *.c)    #采用shell命令行方式,获取当前所有.c文件名
4SRC=$(wildcard *.c)     #或使用wildcard函数,获取当前所有.c文件名
5OBJ=$(SRC:.c=.o)    #将SRC的所有同名.c替换成.o形成目标文件列表
6LFLAGS=-o        #链接选项
7FLAGS=-c         #编译选项
8RM=rm -f         #引入命令
9  
10$(BIN):$(OBJ)
11   $(CC) $(LFLAGS) $@ $^        # $@:代表目标文件名。$^:代表依赖文件列表
12%.o:%.c                        # %.c展开当前目录下的所有.c。%.o同时展开同名.o
13   $(CC) $(FLAGS) $<            # %<:对展开的依赖.c文件,一个一个的交给gcc
14   @echo "compling ... $< to $@"     # @不回显命令
15.PHONY:clean
16clean:
17   @$(RM) $(BIN) $(OBJ)        #$(RM):替换,用变量内容替换它
18   @echo "removing ... $(BIN)"
19  
20  
21.PHONY:test                                                                                                                                                                                                                     
22test:
23  @echo $(BIN)
24  @echo $(CC)
25  @echo $(SRC)
26  @echo $(FLAGS)
27  $(RM)
28

Linux——基础开发工具(上)》 是转载文章,点击查看原文


相关推荐


c++11终章
牢姐与蒯2026/7/23

一.lambda 1.lambda的语法 ①.定义 lambda表达式是一个匿名函数对象,跟普通函数只能定义在全局,或者类里不同,它能够定义在函数的内部。 ②.类型 lambda表达式在使用层而言没有类型,一般用auto或者模板参数定义的对象去接收lambda对象。 ③.lambda的格式 表达式格式跟普通函数相比,少了函数名(匿名),多了捕捉列表。 一个小示例: 注:此处修正一下,返回值部分是“->返回值类型”。 2.lambda的用途 从图中可看出利用lam


GitHub 热榜项目 - 周榜(2026-07-11)
CoderJia_2026/7/15

GitHub 热榜项目 - 周榜(2026-07-11) 生成于:2026-07-11 统计摘要 共发现热门项目: 21 个 Token赞助:siliconflow 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 本期热点趋势总结 本期 GitHub AI 热榜很清晰:Agent 化、低成本推理、隐私本地化、办公自动化正在加速融合。🧠 代表项目里,addyosmani/agent-skills、alir


Objective-C 之 Block 详解
唐诺2026/7/7

iOS核心技能:Objective-C Block完全详解 从语法到原理,从内存到选型,一篇打通Block所有知识点 Block是Objective-C最核心的特性之一,也是每个iOS开发者必须掌握的知识点。它既是回调利器,也是内存陷阱的高发区。本文将系统讲解Block的一切,并在最后与Method进行全方位对比,帮助你彻底掌握Block的选型与使用。 一、什么是Block? Block是Objective-C对C语言函数指针的扩展,它本质上是一个带有自动变量值的匿名函数对象。简单理解:B


用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
小林的编程开发日记2026/6/29

用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台 大家好,去年我写过一篇 Flutter 全链路监控 SDK 那一版可以理解成 v1。 v1 的目标很直接:Flutter App 里发生了什么问题,我要尽可能采到。 比如: Flutter framework error; Dart uncaught error; 启动耗时; 页面加载耗时; Dio / http 请求耗时和状态码; 页面 PV 和停留时长; 用户关键点击; Flutter fram


Python 五大核心数据结构完全指南:列表(List)、字符串(String)、元组(Tuple)、集合(Set)、字典(Dictionary)
FrontPy2026/6/20

Python 核心数据结构完全指南 一、列表 (List) 1.1 定义与特点 列表是 Python 中最常用的数据容器,可以一次性存储多个元素。 定义: 列表名 = [元素1, 元素2, 元素3, ...] 例如: s = [54, 15, 75, 108, 23, 78, 75] 特点: 可以存储不同类型的元素(数字、字符串、布尔值等混合存放)。元素有序,排列顺序固定。元素可以重复。元素可以被修改(增、删、改)。属于序列类型:可通过索引访问。 1.2 列表的索引 正向索引:从 0 开始,


prototype 注入到 singleton 里,prototype是否还是线程安全的
swordbob2026/6/12

"如果 prototype Bean 内部没有共享状态,自身是线程安全的。但 Spring 容器对 prototype 的多例行为有'陷阱',可能导致实际使用中不安全。" 展开讲: prototype 注入到 singleton 里的线程安全分析 一、prototype Bean 自身的线程安全性 1.1 prototype 本身是"独立实例"(这个是安全的) @Service@Scope("prototype")public class ShoppingCart { priv


局部两极分析破解数学建模难题
luj_17682026/6/5

当前博文未提及该问题,以下是基于C知道的知识内容为您回答 在数学建模中,通过“局部两极分析”实现问题求解的突破,其核心思想是:在复杂系统的局部或特定维度上,分别考察其极大化与极小化两种极端状态或趋势,通过分析这两种对立极值的行为、约束与相互作用,来洞察系统的本质结构、关键矛盾与优化路径,从而为全局问题的求解找到突破口。 这种方法融合了优化理论、博弈论和系统分析的思想。 一、 “局部两极分析”的核心逻辑与步骤 “局部两极分析”并非一个固定的算法,而是一种建模策略与思维框架。其通用实施流程可概


ASP.NET Core Razor 语法简述
叫我少年2026/5/30

如果写过 HTML 里嵌 <?php ?>​ 的页面吧?Razor 干的事差不多,只不过嵌入式用的是 C#。Razor 标记可以塞进 .cshtml​(MVC 视图/Razor Pages)或者 .razor​(Blazor 组件),写法跟 Vue 的模板语法有几分神似。下面从最基础的开始,一路讲到那些容易被忽视的坑。 1. 怎么输出 HTML Razor 的默认语言就是 HTML,你写 <p>Hello</p>​,它就乖乖输出 <p>Hello</p>​。但是想混入 C# 逻辑的时候,就得靠


Layui结合springboot读取返回值,前端展示简单示例
一个心烑2026/5/7

一、SpringBoot 后端接口 + Layui 前端页面实现 1 后端返回 JSON 数据 2 前端 Layui 表格展示数据 3 前端表单提交保存到后端 4 完整的异步请求(Ajax)处理 项目结构(标准 SpringBoot): springboot-layui-demo/ ├── src/main/java/com/demo/ │ ├── controller/ │ │ └── UserController.java # 接口控制器 │ ├── entity/ │


算个账也要开顶配 AI?我让 AI 自己劝我换了个小的
小墨同学boy2026/4/28

其实我自己每个月在 AI 上花的钱不少,Claude、GPT、GLM 都有订阅。但其实有很大一部分预算其实是花在处理生活琐事上的——记账、外卖归类、做一个消费数据分析。这种活差不多每天都得跑一遍,所以token 烧得也不少,尤其是有时候开了深度思考的模型反而更容易给错数据。 后来我才反应过来,手里订阅一个不少,结果我一直在拿 Opus 的钱让它当我的计算器。有点奢侈了,所以我准备切换思路看看有没有节省token的办法。 一、我发现一个反直觉的事 在日常生活当中,我的直觉一直是有钱就上好的贵的效果

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读