文章目录
初识Linux
基本指令
这一章指令大多需要实操背诵,用于变换路径、修改文件、安装工具、查看文件属性、使用手册,是Linux的基础。
-
修改白名单
sudoers文件通常位于/etc/sudoers路径下。 -
软件更新以及安装、删除
apt为使用Ubuntu系统软件包,centos系统将apt转为yum即可(有小部分情况下会不适配)sudo apt update # 更新系统中已安装的软件包的索引列表,并不会直接更新软件本身 sudo apt upgrade # 自动更新 sudo apt install sudoku # sudoku是软件包名 sudo apt purge sudoku # 把sudoku包的依赖和所有都删除 sudo apt autopurge # 自动看是否有没用的依赖 sudo apt autoremove # 删除没用的配置文件 -
用户登录以及用户创建(
xshell为例)ssh lpx@123.123.123.123 # lpx是用户名,123.123.123.123是ip # 输入用户密码即可 adduser wangwu # 创建wangwu用户 # 提示输入密码,输入即可 userdel -r wangwu # 删除wangwu ls /home # 显示用户 whoami # 显示当前会话登录的用户是谁
用户指令
Linux许多指令后会有对应的参数,不同参数要表达的功能不同,通常参数可以叠加,意思也是叠加的。而且参数顺序可以变换,保证意思不变
要注意的是空格
路径表示文件唯一性和定位目标文件
ls 和 cd
pwd # 显示当前处于哪个路径
ls # 显示当前文件路径下的文件
ls -l # 显示当前文件路径下的文件的详细属性(不包含隐藏文件)
ls -a # 显示当前文件路径下的所有文件
ls -d # 只查看目录本身,默认查看当前目录
ls -la # 参数叠加,显示当前文件路径下的所有文件的详细属性
ll # ls -la --color=auto的别名,显示当前文件路径下的所有文件的详细属性
# ls后可以跟相对路径或绝对路径查看相应路径下的信息。如ls -l /home。
cd # 回到
cd . # 回到当前目录 .表示当前路径
cd .. # 回到上级目录 ..表示相对路径中的上级目录
cd ~ # 回到当前用户家目录 ~表示当前用户家目录
cd - # 回到上一次所在的路径 -表示上一次所在的路径
cd /home/lpx # 去/home/lpx路径下
cd ./home # 去当前路径下的home文件夹内
touch test.c #创建test.c文件
-
文件属性
- 文件所占空间 = 文件的属性 + 文件的大小

- 1表示当前文件下一共有多少个文件;
- 2表示文件权限以及是否是目录,
d表示文件是目录,rwx分别表示文件可读、可写、可执行。
-表示对应权限是非,即没有对应属性。要注意的是,文件的属性一共10位,第一位表示文件类型,后面每三位,分别表示文件所属关系对应的rwx权限。文件所属关系分三种:文件所有者(User)、文件所属组(Group)、其他用户(Others); - 3表示文件的硬链接数,后续有详细介绍;
- 4表示文件所有者和文件所属组是谁
- 5表示文件大小
- 6表示文件的最后一次修改时间
- 7表示文件名,颜色变化表示文件是
*.o可执行文件,或者目录
pwd
显示当前在哪个路径下
touch + 文件名
注意touch和文件名之间有空格
创建文件。文件 = 文件内容 + 文件属性,所以创建空文件也会占硬盘空间
touch file{1..100}.txt可创建file1.txt file2.txt file3.txt ……file100.txt
rm file{1..100}.txt可删除file1.txt file2.txt file3.txt ……file100.txt
stat + 文件名
注意
stat和文件名之间有空格查看文件属性。文件属性
ACM:Access(访问时间)、Modify(文件内容最后一次修改时间)、Change(文件权限、所属组、文件名、文件内容修改的最后时间)访问文件指的是读取文件的内容,但不一定会修改它。比如执行命令
cat或者打开文件进行读取时,atime会更新。
mkdir rmdir rm
mkdir新建目录mkdir -p d1/d2/d3/d4递归新建目录
rmdir只能删除空目录
rm可直接删,无论是文件、目录,都可以直接用rm + 文件名来删除。在使用
rm时,系统会再次询问是否删除。可以通过加参数-f表示强制删除,对于递归目录,可以用参数-r来删除,(resursion递归)rm -rf d1
*
*表示填充的意思。如:
ls -al *.c表示显示所有.c后缀文件的详细信息,rm -rf *表示删除当前路径下所有文件
tree
将当前目录以树状结构展示
sudo apt install -y tree在Ubuntu系统下下载tree
man
sudo apt-get install glibc-doc manpages-posix-dev
用于查看系统中各种命令、函数、配置文件等的帮助文档。
man是 “manual”(手册)的缩写。man [选项] <命令或文件>来使用,如:man ls && man 2 open
选项:
- 1: 用户命令(如
ls,cp)- 2: 系统调用(如
open,read)- 3: 库函数(如
printf,malloc)- 4: 设备文件(如
tty,null)- 5: 文件格式(如
passwd,fstab)- 6: 游戏(如
fortune)- 7: 杂项(如
man,intro)- 8: 系统管理命令(如
mount,useradd)可以使用
-k选项搜索包含关键字的手册页。这会列出所有包含该关键字的手册页。
- 退出 man 页面: 按
q键。- 跳到顶部: 按
g键。- 跳到底部: 按
G键。- 搜索文本: 按
/键,然后输入搜索的关键字。
which
查找给定命令的 可执行文件 的路径,如:
which ls查找ls的文件路径,出/usr/bin/ls所谓的命令,就是在Linux的/user/bin目录下的可执行文件。你输入ls\rm等指令时,系统默认从/user/bin目录下寻找指令
若自己设置一个可执行程序:lpx.o在执行时,输入lpx.o并不会执行成果。因为系统默认从/user/bin目录下寻找指令,没找到就不会执行。可以通过把自己的可执行文件复制到/user/bin目录下,就可以直接通过输入lpx.o执行。(通常情况下不推荐,会污染系统命令)在环境变量方面会着重讲原理。
工作原理:
which会遍历 $PATH 中列出的目录,并查找给定命令的可执行文件。如果找到了该命令,它会返回文件的完整路径。- 如果没有找到该命令,它不会返回任何内容。
which默认只返回第一个找到的路径。可以使用which -a可以列出所有找到的命令路径。
file
通过检查文件的内容来判断文件类型,而不仅仅是根据文件的扩展名。这个命令可以识别文本文件、二进制文件、压缩文件、可执行文件等不同类型的文件。
file <文件>来使用。
批量检查文件类型: 如果你有一系列文件,需要检查它们的类型,可以将文件列表提供给
file命令:file -f filelist.txt,filelist.txt写明文件
file命令通过读取文件的魔术数字和文件头信息来判断文件类型。魔术数字是文件开头的一些特定字节,用于标识文件格式。- 如果文件是纯文本,
file会输出类似于ASCII text或UTF-8 Unicode text。- 如果文件是二进制格式(例如一个编译后的程序),
file会输出类似于ELF 64-bit LSB executable或Mach-O 64-bit executable。- 对于图像文件,
file会显示文件格式(例如 PNG, JPEG, GIF)。- 对于压缩文件,
file会指出文件是压缩格式,例如.zip、.tar、.gz等。- 对于音频或视频文件,
file会显示类似于Audio或Video的信息。
alias
取别名,如:
alias ll='ls -l –color=auto',以后输入ll就默认执行ls -l –color=auto
- 使用
alias创建的别名仅在当前终端会话中有效。如果你关闭终端或重新启动计算机,别名会消失。若要在每次登录时都能使用别名,你需要将别名添加到你的 配置文件 中(例如.bashrc或.bash_profile)。- 也可以使用
unalias命令来删除别名:unalias ll
cp
复制文件到另一个路径下
cp log.txt ../lpx/mylog.txt,mylog.txt表示新文件的文件名。默认情况下就是同名文件(ACM不会复制)
-r可以进行递归复制
echo
向显示器写入后续内容。如:
echo ‘hello’可以在显示器回显hello
重定向
我们知道,Linux操作系统下,有一切皆文件的理念。所以,对于OS,显示器也是一个文件,在使用cat ls echo等等指令后,显示器会回显出对应指令的结果。其原理就是把结果
cp到显示器文件来让我们看到。而所谓的重定向,就是改变其默认的cp路径。
>符号:使用echo ‘hello’ > log.txt可以把hello打印到log.txt文件中(若没有log.txt文件,会自动进行创建,然后cp hello到log.txt中。把本来要cp到显示器的内容修改到log.txt文件中,这一过程就是重定向。
>>符号:与>不同的是,>会清空文件内容,再将内容cp到指定文件中,而>>表示追加重定向。再文件现有的内容下增加内容,并不会清空。前面提到显示器也是文件,对于
xshell软件,==ls /dev/pts==可以查看当前用户不同会话下的显示器文件
<符号:输入重定向。
<<符号:对照<,追加重定向。
mv
- 对照
cp,mv是移动、剪切的操作。mv可以进行文件重命名。mv text.c log.c把text.c重命名成log.c
cat tac
接文件名,表示打印文件内容。不同的是,cat从第一行打印到最后一行,tac从最后一行打印到第一行,倒着打印
more less也可以查看文件,并提供搜索选项
wc
用于统计文件中字符、单词、行数等信息。它可以处理一个或多个文件,并输出这些文件的各种统计数据。
如果没有提供选项,
wc会分别对应输出:行数、单词数、字符数输入:
wc file.txt输出:10 50 300 file.txt
head
配合管道
|使用,如:cat log.txt | head - 5表示查看log.txt前五行的内容
head -5 log.txt也可以查看前五行内容查看指定行的数据,以[5050,5010]为例
head -5051 mylog.txt >tmp tail -11 tmphead -5010 mylog.txt | tail -11
date
时间戳(Timestamp)是表示时间的方式,表示为从 1970年1月1日00:00:00 UTC 到某一时刻的秒数。Linux 提供了
date命令,允许用户轻松地进行时间戳与日期之间的转换。(北京时间 = UTC + 8)
date查看当前的日期和时间date +%s查看当前时间戳date -d @1686544560将时间戳转换为日期date -d "2025-06-12 12:00:00" +%s将特定日期转换为 Unix 时间戳date +%Y_%m_%d-%H:%M:%S -d@1637600831时间戳1637600831转变成自定义类型时间%Y:四位年份(例如:2025)%m:月份(01 到 12)%d:日期(01 到 31)%H:小时(00 到 23)%M:分钟(00 到 59)%S:秒钟(00 到 59)
cal可以来查看日历cal 2025生成2025年日历
find
find /root -name test.c # 当前路径下遍历查找`test.c`文件 find /root -size -10M # 查找小于10M的文件 find /root -size +10M # 查找大于10M的文件
whereis
对比
which,会显示出对应指令的手册页位置
nano
nano <文件名>进行文本编辑,vim更好用,后文会着重讲解vim的使用
grep
grep "pattern" file1 file2 file3在多个文件中查找"pattern",并显示匹配的行。
- 不区分大小写
Copy Codegrep -i "pattern" file
-i忽略大小写进行匹配。
- 显示匹配行的行号
Copy Codegrep -n "pattern" file
-n显示文件中匹配"pattern"的行及其行号。
- 反向查找(不匹配)
Copy Codegrep -v "pattern" file
-v查找文件中不包含"pattern"的行。
top
top -d 1每1s,刷新一次运行情况
top -n 1显示1次后退出
zip unzip
需要安装软件包使用
apt install -y zip unzipzip mylog.zip mylog.txt # 压缩mylog.txt成mylog.zip unzip mylog.zip # 解压myloog.zip zip -r test/115.zip 115 # 递归压缩115目录到./test/115.zip unzip -d test # 解压到test目录
lrzsz
不同操作系统间传文件
apt install -y lrzsz sz 111.zip # Linux->Windows(在本机的不同系统) rz # Windows->Linux(在本机的不同系统) scp 111.zip lpx@123.123.123.123:/home/lpx/code # 跨机进行传文件
tar
用于解压和压缩成为
*.tgz文件tar -xzvf test.tgz -C ../lesson # 解压到../lesson路径 tar -czvf test.tgz test.txt # 压缩成为test.tgz
bc
配合管道进行数字运算
echo "1+2+3+4"输出1+2+3+4
echo "1+2+3+4" | bc输出15
uname lsb_release
uname和lsb_release查看本机OS信息,-a查看全部信息
history
查看历史指令
gcc1
gcc code.c -o code对code.c编译形成code二进制可执行文件,-o后接编译形成新文件的文件名,gcc -o code code.c一样可以有相同的效果
LinuxOS不以文件后缀决定文件类型,mv code b.txt一样可以运行./b.txt前面提到过,
Linux会从/user/bin下寻找你输入的指令,如果你想运行code要指明文件路径./code或者把他放到/user/bin路径下(不推荐)。
gcc code.c会自动把code.c编译形成a.out文件
ldd
ldd a.out查看a.out用了什么库
shutdown
用来关闭系统或重启系统的命令
-h:关闭系统(halt),使系统关机。-r:重启系统(reboot)。-P:关闭电源(Power Off),类似于-h。-c:取消当前计划的关机或重启。+m:在指定的延迟时间后关机或重启,其中m是以分钟为单位的时间。sudo shutdown -h +5 "System will shut down in 5 minutes for maintenance"带注释的关机hh:mm:指定一个具体的时间来进行关机或重启,例如22:00表示晚上10点。
快捷键
ctrl + c # 对前台进程发起终止信号 ctrl + d # 退出登录 上下键 # 快捷查找历史指令 ctrl + r # 搜索历史命令 ! + a # 执行最近的a开头的指令,换成其他字母也一样
初识Linux OS
这一章意义在于理解什么是操作系统,什么是内核,我们常用的Windows和安卓到底是什么,Linux又是什么
OS(Operator System)就是操作系统。狭义上的OS就是内核(kernel),广义上,OS包括kernel和外壳程序。

-
操作系统是软硬件资源管理(内存、文件、进程、驱动管理)的软件,向上有一个外壳层,外壳层上就是用户。向下是驱动程序(网卡驱动、硬盘驱动等),在向下是底层硬件(网卡、硬盘等)。
-
OS提供了高效安全的运行环境
-
Linux OS不以文件后缀区分文件类型,用文件属性来区分的
d:文件夹 -:普通文件 l:软连接 b:块设备文件 p:管道文件 s:套接口文件
-
shell就是终端的解释器,用于解释命令。而图形化的点击操作是由图形化服务框架来实现交互的。图形化界面、shell都是外壳程序的一部分
权限
在我们在以用户身份修改
/etc/sudoers,或者输入apt install -y zip时会出现Permission denied(权限拒绝)信号,这是因为你没有相应的权限,需要提升权限在完成指令,怎么提升权限呢?就是我们常见的sudo+指令格式,然后输入自己用户的密码以提高权限
-
白名单
在
sudoers配置中,“白名单” 是一种访问控制策略,只有特定用户或用户组被列在白名单中,才有权限使用sudo执行特定命令。白名单存储在/etc/sudoers路径下 -
普通用户->
root在执行
sudo指令时,本质是提升权限到root(管理员),来执行相应的指令。那么,如何直接成为root身份呢?su root # su是切换身份的意思,后面接想要成为的对象。要注意的是,su默认参数就是root # 然后输入root密码即可切换 -
root->普通用户root切换普通用户不用输入密码即可切换
su lpx -
权限的理论理解
-
权限 = 人 + 事物属性 —> 文件权限 = 角色 + 文件属性
- 访问一个文件,要看你是什么角色,你的角色是否有对应的权限来访问
-

- 上文也提到过,图中2表示文件的类型和权限。第一位表示文件类型,后面每三位,分别表示文件所属关系对应的
rwx权限。文件所属关系分三种:文件所有者(User)、文件所属组(Group)、其他用户(Others);对应“权限的理论理解”中的文件属性。而4中两列分别表示文件拥有者和文件所属组,除这两个意外的用户都是其他用户。
- 上文也提到过,图中2表示文件的类型和权限。第一位表示文件类型,后面每三位,分别表示文件所属关系对应的
-
-
修改权限
-
我们首先要知道,只有文件的
user才能修改权限 -
文件属性修改:
chmod我们知道,文件所属关系分三种:文件所有者(User)、文件所属组(Group)、其他用户(Others)。在修改对应权限时,其三者缩写为
u,g,o,而文件属性有rwx分别表示可读可写可执行,想要对应的用户添加/减少相应的权限,用+ -符号即可,代码如下:chmod u+x text.txt # 给user运行的权限 chmod u+r text.txt # 给user可读的权限 chmod u-x text.txt # 不允许user运行 chmod u-rw text.txt chmod g+x text.txt chmod g+rwx text.txt chmod o-rwx text.txt除了上文的操作外,有更方便操作的数字方式进行权限修改。我们把十位中的后九位可以分成三个区域,每三位对应一个八进制数字表示权限即可
如图,我们把非
-的视为二进制的1,-视为二进制的0,前三个,对应的权限分别是750 755 600那我们加入代码来修改权限试试看
chmod 666 lpx.txt # 修改lpx.txt所有的所属关系都是可读可写不可运行 -
身份修改:
chown chgrp从上文,我们能知道文件有三种所属关系,那么怎么设置/修改文件的
user group呢?要注意的是,身份修改要使用
root权限sudo chown wangwu text.txt #修改user sudo chown zhangsan text.txt # 修改user sudo chgrp lpx text.txt # 修改所属组
-
-
身份匹配
仔细观察上文,就会发现
lpx是user 和 group那么到底该遵守哪一个权限呢?在身份匹配时,只会从user–>group–>other顺序,匹配成功一次,实验如下:
-
dir权限r:是否可以ls读取目录文件内容w:是否可以修改目录路径下的文件名字,删除、创建文件。(文件权限可以修改)x:是否可以进入dir
-
umask权限掩码-
最终权限 = 起始权限 & (~
umask) -
touch生成文件的其实权限是666,但是为什么我们在touch lpx.txt的时候,会发现生成的文件默认权限是664,这是因为权限掩码(umask)过滤掉出现的权限 -
输入
umask可以查看权限掩码,一般都是0002第一个0表示八进制
-
-
粘滞位
粘滞位在特定目录下限制文件的删除和重命名操作。它通常用于公共目录中,尤其是在多用户环境下,比如
/tmp目录(系统自己设置的共享文件目录)。通过修改目录的
w权限,可以保护目录不再创建、删除文件。在多用户共享目录的情况下,也会导致other不能创建、删除文件。通过粘滞位可以解决这个问题——添加粘滞位的目录中,只有文件的所有者、根用户(root)或者目录的所有者才能删除或重命名该目录下的文件。粘滞位是一种保护机制,通常应用于公共目录,确保只有文件的所有者和
root用户能够删除或修改文件。它通过减少误操作和恶意删除,增强了多用户系统的安全性和稳定性。-
限制删除权限: 粘滞位使得只有文件的所有者、根用户(
root)或者目录的所有者才能删除或重命名该目录下的文件。即使其他用户在这个目录中具有写权限,也不能随意删除或修改别人创建的文件。 -
常见应用场景: 粘滞位通常用于公共目录,如
/tmp。在这些目录中,多个用户可能会创建和删除文件。启用粘滞位后,只有文件的创建者或root才能删除或修改文件,避免了其他用户删除或篡改文件的风险。 -
设置粘滞位: 使用
chmod命令可以为目录设置粘滞位。粘滞位的权限标志是t。例如,给/tmp目录设置粘滞位:sudo chmod +t /tmp设置后,/tmp目录会获得粘滞位,只有文件的所有者、root或该目录的所有者才能删除该目录中的文件。 -
任何用户,在设置了粘滞位的目录下,只能删除自己的文件,而不能和删除其他人的文件
-
粘滞位表现在第十位。
rwxrwxrwt中的最后一个t就表示/tmp目录启用了粘滞位。
-
yum/apt 工具级别安装
-
OS生态
OS生态由社区论坛、官方文档、软件体系、维护更新速度、OS自身、富有针对性的客户群体决定。
一个好的社区论坛和更新速度可以提高用户数量,比如
Ubuntu。好的社区会方便用户寻找自己出现的问题的解决方法、更好使用其OS。而Windows针对全民、有着不错的更新速度、外加起步早,所以也导致用户数量巨大
-
什么是yum/apt
yum/apt就是应用商店,找到就下载。在使用yum/apt时,操作系统向软件包服务器请求软件包,服务器返回软件包,就可以下载了。
为什么不能直接移植windows程序到Linux中使用呢?
操作系统架构不同,二者在文件系统管理、进程管理、内存管理等方面有着根本性的区别,Windows和Linux提供的系统调用接口(API)不兼容;文件系统也不同,在文件存取方式、权限管理等方面存在差异。此外,图形界面支持不同、 二进制格式差异、依赖库和驱动问题也是其原因。
从API方面分析:我们首先要知道,C标准库对于windows和linux各有一套编译方法(目的在于适应不同操作系统)。例如printf函数,他本质是封装了操作系统的系统调用接口,而windows和linux是不同的操作系统,那么这个系统调用接口也是不同的,所以生成的二进制也一定不同。
面对这个问题,可以设计一个软件兼容层:Wine、虚拟机都是例子。这里对Wine进行了解——Wine 是一个兼容层,允许 Linux 用户运行许多 Windows 应用程序。它并不直接“移植”程序,而是通过实现 Windows API 来让 Windows 程序在 Linux 上运行。
能直接移植Centos程序到Ubuntu中使用吗?在其内核版本一样的情况下
一个可执行程序,运行起来需要动态库的依赖,这个涉及了可执行程序链接的库版本、路径(版本和路径不一样也是不可以的)。除非二进制程序的所有动态库(版本+路径)在目标系统存在且兼容,才能运行
在使用中常常感受不到不同OS下差异,因为C语言帮我们封装了每个操作系统的系统调用,然后C语言给我们提供了一样的函数,屏蔽了底层的差异,上文printf就是例子。
vim
vim作为一种高度可定制的文本编辑器,使用比nano方便,在此对快捷键,和三种模式详细介绍,也是除vscode外主要linux程序文本编译器。vim支持自定制,可交给大模型生成定制文件,修改/.vimrc文件即可
-
基础指令
- vim + 文件名 + 7,进入命令模式,光标在第七行,不写7默认在第一行(可通过修改
/.vimrc修改默认)。 i:进入插入模式——进行文本写入ESC:回到命令模式——所有快捷键都是在命令模式下运行的::底行模式:w保存:q退出:set nu显行数,指令最后加!表强制,如:wq!表强制保存退出。:!command- 此外,底行模式可以执行
shell的命令
- vim + 文件名 + 7,进入命令模式,光标在第七行,不写7默认在第一行(可通过修改
-
快捷键:
-
shift zz保存并退出 -
10 yy从当前行开始复制10行,不写10默认当前行 -
10 dd剪切10行,不写10默认当前行 -
10 p粘贴10次,不写默认1次 -
gg最开始行 -
10 shift g跳转到第10行,不写10,默认最末尾行 -
shift 6到当前行最开始 -
shift 4到当前行最末尾 -
w向前一个单词 -
b回退一个单词 -
hjkl上下左右 -
~对光标处字母大小写切换 -
u撤销上一步 -
ctrl r对u撤销 -
5 d删除光标后5个内容,默认一个,x也可以完成 -
shift x删除光标前 -
r修改光标所在字符 -
shift r进入replace模式 -
shift #选中一个单词,按n进入上一个位置 -
ctrl v批量化处理,选中单位。shift i进入插入模式,esc回命令模式,批量操作完成。此外,在选中后,也支持其他快捷键叠加 -
vs text.c完成分屏,另一边是text.c -
ctrl ww切屏光标
-
-
.vimrc被vim识别,进行初始化操作,这就是vim环境配置
gcc
程序在从
*.c文件变成可运行的二进制文件需要经过以下几步:预处理、编译、汇编、链接,下文着重讲解这四步内容
-
前文提到过,Linux OS不已文件后缀识别文件类型,但是编译器要求源代码使用特定后缀来识别为C语言源文件。所以,我们文件名后缀要有所要求。
-
预处理:进行宏替换、去注释、条件编译、头文件展开等,将.c文件预处理形成.i文件
-
代码:
gcc -E code.c -o code.i
-
-
编译:编译
.i文件形成.s文件。是将C语言编译形成汇编语言的过程-
代码:
gcc -S code.i -o code.s
-
-
汇编:将汇编语言翻译成机器码的过程,是汇编文件生成重定位目标二进制文件的步骤(这里的重定位,表明其需要重新填写目标函数在库中的地址)。把
.s文件形成.o文件-
代码:
gcc -c code.S -o code.o
-
-
链接:把生成的重定位目标二进制文件进行链接,填写目标函数在库中的地址。把多个
.o文件链接形成一个可执行的二进制文件-
代码:
gcc code.o code1.o -o code
-
-
如何理解库?
-
平常看到的
stdio.h iostream.h就是C语言提供的库,目的在于让程序员直接使用,提高开发效率,程序员不用自己造轮子。 -
库的分类:
- 静态库:Windows下
.lib为后缀的文件,Linux下.a为后缀的文件 - 动态库:Windows下
.dll为后缀的文件,Linux下libXXXX.so格式的文件
- 静态库:Windows下
-
链接方式:
我们先生成一个
lpx.c文件,包含stdio头文件,和main函数。方便后续实验-
动态链接
gcc lpx.c -o a.out生成a.out文件查询
.a.out的文件类型——file a.out指令,发现其有dynamically linked字样,表明是动态链接
我们再使用ldd a.out指令查询其使用的动态库,回显libc.so.6->/lib64/libc.so.6(不同版本表达样式可能不同,格式基本如此),不难看出,这是使用了c的动态库我们再
ls libc.so.6->/lib64/libc.so.6 -l可以发现,这是一个文件 -
静态链接
gcc lpx.c -o b.out -static生成b.out文件查询
b.out的文件类型——file b.out指令,发现其有statically linked字样,表明是静态链接我们再使用
ldd b.out指令查询其使用的动态库,回显not a ddynamic executable,表明没有使用动态库 -
差异
我们使用
ll,查看a.out和b.out的属性——发现两者文件大小差别很大。这是因为,静态链接将所有需要的库代码直接嵌入到最终的可执行文件中,而动态链接是通过运行时加载共享库2来使用库中的代码。动态库优点:节省资源。缺点:一旦丢失使用的任何一个动态库,所有程序无法直接运行,无法直接移动可执行文件交给其他机器运行,其他机器可能没有相应的动态库。(后文讲虚拟地址空间会着重讲动态库)
静态库优点:不依赖任何库,自己独立就能运行。缺点:体积大,占内存、磁盘空间;加载到内存速度受影响。
-
-
453

被折叠的 条评论
为什么被折叠?



