东莞网站优化如何网站开发入门书籍推荐
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:20
当前位置: 首页 > news >正文
东莞网站优化如何,网站开发入门书籍推荐,个人备案网站做淘宝客可以用吗,软件自学网官方网站本文已收录至《Linux知识与编程》专栏#xff01; 作者#xff1a;ARMCSKGT 演示环境#xff1a;CentOS 7 软硬链接和动静态库 前言正文软硬链接原理使用 文件时间动静态库库介绍静态库静态库制作静态库的使用关于静态链接 动态库动态库制作动态库的使用关于动态链接 补充 最… 本文已收录至《Linux知识与编程》专栏 作者ARMCSKGT 演示环境CentOS 7 软硬链接和动静态库 前言正文软硬链接原理使用 文件时间动静态库库介绍静态库静态库制作静态库的使用关于静态链接 动态库动态库制作动态库的使用关于动态链接 补充 最后 前言 当我们安装一款软件成功后桌面会多一个图标如果我们点击图标就能启动软件但那个图标就是软件本身吗显然不是图标只是软件启动程序的一个快捷方式在Linux中可以通过软硬链接来创建类似于Windows下的软件快捷方式Windows下创建快捷方式一般相当于Linux中的软连接当Windows中的一个软件启动之后会加载各种文件一般我们看到的软件启动程序都很小但是软件安装包却很大例如游戏其实软件中大部分都是库文件关于Linux下的库本节将会详细为您介绍 正文 软硬链接 关于软硬链接其中涉及Linux文件系统的知识如果有疑问请先移步Linux文件系统概述 原理 软链接 软链接又称为符号链接软链接是一个单独的文件启动这个软链接程序会跳转启动这个软链接指向的程序既然是一个单独的文件那么软链接文件就拥有独立的inode和文件属性软链接的主要存储内容是源文件的地址所以软连接一般很小且依赖源文件 因为软连接非常依赖源文件所以源文件一旦不存在或被源文件路径出错再次启动该软链接(快捷方式)则会出现 No such file or directory 的错误提示表示系统没有找到对应文件 当我们删除软链接文件时并不会对源文件产生任何影响就像我们删除Windows桌面上的快捷方式并不是清除了该软件一样想删除该软件必须删除该软件所在的安装目录 硬链接 硬链接与软链接不同硬链接没有独立的inode和文件属性其只是在目录中创建了与源文件inode和硬链接名的映射关系并在源文件的文件属性中引用计数进行1表示增加了一个硬链接 当我们删除一个硬链接时文件系统会判断该链接的inode源文件ret_count计数是否为0如果减去1后引用为0则删除该文件否则只是删除该目录下的一个硬链接映射关系且源文件引用计数-1所以删除硬链接文件只有删除最后一个硬链接才是真正删除文件否则也不会对源文件产生影响 所以硬链接并不在意源文件因为只要硬链接存在文件就存在而软链接的源文件被删除则软链接失效 普通文件可以建立硬链接和软链接但是目录只能建立软链接 当我们新建一个文件时其默认硬链接数为1而目录的默认硬链接数为2 为什么新目录的硬链接数为2 因为新目录与父级目录建立了硬链接 在Linux系统中 . 表示本目录. .表示上级目录 所以在父级目录下每创建一个新目录其硬链接数就会1因为新目录与父级目录构建的新的硬链接关系但是Linux系统不允许用户手动为目录创建硬链接因为这样会破坏文件系统的树结构严重时可能会变成图使得文件系统崩溃 硬链接就像是浅拷贝只拷贝了inode。 使用 生成软链接文件 \( ln -s 源文件路径 软链接文件名注意可以对目录进行软链接其方式与普通文件进行软链接方式相同 生成硬链接文件 \) ln 源文件路径 软链接文件名虽然软硬链接在使用上没有差别但是底层差别还是非常大的 取消链接 删除链接文件 \( rm 链接文件unlink取消链接 \) unlink 链接文件注意普通文件的首个标识符为 -软链接文件标识符为 l而硬链接本质上是源文件的别名所以也是普通文件 - 文件时间 每一个文件从创建之日起就有三个时间(简称为 ACM 时间) 访问时间 Access 最后一次查看内容的时间如何判定取决于系统修改属性时间 Change最后一次修改文件属性的时间修改内容时间 Modify最后一次修改文件内容的时间 注意 因为modify是文件属性modify修改了change也会修改更改文件内容与查看文件内容不一样区别于access和modify查看文件改变access修改文件改变modifyLinux系统并非每次查看都会改变文件的access时间(因为修改access涉及文件属性的修改需要读取硬盘)有一定的策略这样可以减少与硬盘的交涉提高效率。 我们可以通过 stat 命令查看文件属性和ACM时间 \( stat 文件名动静态库 库介绍 原来在学习C语言时写一下学校课程设计可能会需要函数的声明和定义进行分离这样可以让代码显得不凌乱 其实图中的test.cpp就可以充当一个C/C的函数库但是我们在使用时需要结合头文件test.h一起使用 但是在实际的项目开发过程中一个保密的项目是不能透露库中的源代码的我们只想留下 头文件 声明函数接口而具体实现放在一个保密的库中(别人可以使用但是无法获取函数实现)此时我们就需要引入动静态库了 说明 一般系统已经预装了C/C头文件和动态库文件头文件提供方法说明库提供方法实现头和库是有对应关系的要组合在一起使用头文件是在预处理阶段就引入的链接的本质其实就是链接库引入库文件一方面是为了提高开发效率(代码复用性等)另一方面可以保密 无论是在Linux系统中还是Windows系统中都存在库分为动态库和静态库虽然不同环境下的后缀有所不同但其工作原理是一致的 Linux 系统中.a 后缀为静态库.so 后缀为动态库Windows 系统中.lib 后缀为静态库.dll 后缀为动态库 在Linux系统中库命名一般为libstdc.so.6去掉前缀 lib 和后缀 .so.6 剩下的就是库名 stdc 。 我们可以使用命令查看Linux环境中的库文件 # 查看C库 \) find /usr/lib64/libc*
查看C库
$ find /usr/lib64/libstdc*
查看所有库
$ find /usr/lib64/lib该图只截取了一部分实际上有很多库 在我们写C/C程序时离不开库函数比如我们使用的各种STL容器库中只会提供给我们头文件开放接口进行使用并不会让我们看到具体实现其具体实现已经打包成库(二进制文件)在平时使用时编译器默认使用动态库而非静态库动态库在日常使用具有较大优势 如果我们想指定使用静态库编译在gcc/g下只需要加上 -static 选项即可但是前提是Linux环境中已经安装C/C静态库一般服务器和虚拟机是没有安装的 C/C静态库的安装(非root用户需要sudo提权) # 安装C静态库 yum install -y glibc-static
安装C静态库
yum install -y libstdc-static动静态库比较 区别静态库动态库空间大小占用空间较大占用空间小调用方式函数实现在程序中直接在程序中执行通过地址转到动态库中执行动代码加载速度库函数加载到程序中空间占用大多个程序共享一个已加载的动态库空间占用小依赖性直接在程序中运行依赖于动态库 补充 动态库是在函数调用出留下地址链接在调用该函数时转到内存中的动态库在指定的函数位置执行代码而静态库是将函数实现直接拷贝到调用出运行时直接执行 简言之如果没有库文件那么你在开发时需要自己手动将 printf/cout 等高频函数编写出来因此库文件可以提高我们的开发效率比如 Python 中就有很多现成的库函数可以使用效率很高 一般库分为三种 第一方库语言自带的库第二方库操作系统提供的库第三方库我们自己制作的库或网上下载的库 静态库 静态库制作 准备库文件和头文件 add.hpp #pragma onceint add(int a,int b);add.cpp #include add.hppint add(int a,int b) { return ab; }sub.hpp #pragma onceint sub(int a,int b);add.cpp #include sub.hppint sub(int a,int b) { return a-b; }main.cpp #include iostream #include add.hpp #include sub.hpp using namespace std;int main() {coutadd(1,2)endl;coutsub(1,2)endl;return 0; }编译链接形成二进制程序 \( g main.cpp add.cpp sub.cpp -o exe -stdc11注意声明与定义分离的情况下需要指明链接的函数实现文件 接下来开始打包成静态库主要分为两步 1.将源文件进行 预处理-编译-汇编生成可链接的二进制 .o 文件 \) g -c add.cpp sub.cpp执行完毕后生成与文件名相同的 .o 二进制链接文件 2.通过 ar指令 将 .o 文件打包为静态库 #格式ar -rc { lib静态库名.a } {链接文件1.o 链接文件2.o …} $ ar -rc libmymath.a add.o sub.o
也可以简写为ar -rc libmymath.a *.o注意实际的静态库名为 mymath 但是gcc/g编译器会识别静态库自动去掉头(lib)尾(.a)按照规范我们必须这样写 此时就成功生成了静态库文件 ar指令除了可以打包链接文件成为库文件还可以查看库文件中的打包内容 $ ar -tv {静态库文件.o}静态库的使用 我们自己指针的库是第三方库在使用上区别与第一方和第二方库区别很大 此时如果我们直接编译程序是无法编译的 我们将上面使用和生成的文件进行规整 将头文件放在_hpp目录库文件放在lib链接文件放在_o实现文件放在_cpp留下main.cpp在本目录下这样在本目录下就既没有头文件也没有实现文件了此时我们进行静态编译 1.直接使用静态库 # 格式g 代码文件.cpp -I 头文件夹路径 -L 库文件夹路径 -l 静态库名(去掉头尾)
\( g main.cpp -o static_exe -I ./_hpp -L ./lib -l mymath -static #静态链接 \) g main.cpp -o exe -I ./_hpp -L ./lib -l mymath #动静混合
gcc使用方法与此相同使用第三方库与使用标准库和系统库不同使用标准库和系统库都是系统级的gcc/g 默认找的就是 stdc/stdc 库而第三方库则需要我们自己指定 2.将头文件和静态库文件安装至系统库下 Linux系统C/C头文件路径/usr/include/ Linux系统库路径/lib64/ # 注意非root用户需要sudo提权
\( cp ./_hpp/*.hpp /usr/include/ \) cp ./lib/*.a /lib64/将库和头文件安装到系统目录下后只需要指定库名即可完成编译链接 \( g main.cpp -o exe -l mymath #动静混合 \) g main.cpp -o static_exe -l mymath -static #静态链接注意这里极其不提倡这种私自安装外部库的方式将自己写的文件安装到系统目录下是一件危险的事(导致系统环境被污染)如果不得已用完后记得手动删除 关于静态链接 静态链接是在链接时将调用函数处的函数调用替换为函数执行代码(二进制代码)可执行程序从根本上脱离了库的限制在同系统的机器上无论是否有静态库都可以运行不依赖任何静态库 静态库所体现的优点是运行比较快但静态链接形成的可执行程序本身就有静态库中对应方法的实现(将代码拷贝到可执行程序中)静态链接的程序非常占用资源内存中会程序多个重复的代码(可执行程序体积变大加载占用内存)也占用磁盘资源如果是给用户用的软件那么下载周期就会变长占用网络资源 注意如果要使用静态链接需要加上 -static 否则编译器将使用静态库进行动态库和静态库的混合链接 动态库 动态库制作 我们准备与静态库制作相同的五个文件 打包为动态库分为两步 1.编译源文件生成二进制可链接文件.o同时形成与位置无关码 # 格式gcc -c -fPIC {实现文件.cpp} $ g -c -fPIC add.cpp sub.cpp
gcc 使用方式与g相同同样的会形成 .o 链接文件 说明fPIC这个选项是形成.o文件同时形成与位置无关码动态库中里面的代码地址排布与静态库是有区别的动态库经常使用所以gcc/g自带打包动态库功能。 2.打包链接文件形成动态库 # 格式g -shared { 链接文件.o } -o { libmymath.so }
g -o libmymath.so *.o -shared
gcc 使用方式与此相同说明shared表示形成(打包成)动态库或共享文件 动态库的使用 同样的我们先规整文件到不同的文件夹 我们使用静态库的方法去编译可执行程序 \( g main.cpp -o exe -I ./_hpp -L ./lib -l mymath之所以会运行失败是因为当前只告诉了编译器动态库的位置没有告诉 OS 出现这种情况可以使用 ldd 指令查看程序的链接情况 \) ldd 可执行程序动态库处显示状态为没有链接未发现动态库 这也说明我们不能盲目进行链接在此之前我们需要让操作系统知道库的位置有三种方法 1.修改临时环境变量 添加动态库路径至 LD_LIBRARY_PATH 环境变量中因为环境变量 LD_LIBRARY_PATH 是程序在进行动态库查找时的默认搜索路径。 \( export LD_LIBRARY_PATH\)LD_LIBRARY_PATH:/动态库目录详细(绝对)路径/注意 更改环境变量只是临时方案重新登录bash后就失效了需要重新配置 2.将动态库的软链接文件存入系统目录中 我们将动态库建立软链接放入系统库目录中(普通用户需要sudo提权) # ln -s /动态库绝对路径/ /lib64/动态库名称(与软链接的动态库名称相同)\( ln -s /home/ARMCSKGT/演示文件夹/lib/libmymath.so /lib64/libmymath.so注意 创建软连接文件时需要使用绝对路径这种方式的修改是永久有效的但是我们不建议使用如果非必要建议用后删除避免冲突和污染系统环境。 3.更改配置文件中的信息 系统的第三个动态库查找路径就是前往动态库配置目录的各配置文件提供的路径中查找我们可以写一个自己配置文件里面写入动态库的路径放入该目录中 \) touch mylib.conf #创建一个配置文件
\( echo /home/ARMCSKGT/演示文件夹/lib/ mylib.conf #将动态库绝对路径写入配置文件 \) mv mylib.conf /etc/ld.so.conf.d/ #将配置文件放入系统目录/etc/ld.so.conf.d/中 \( ldconfig #重新加载系统配置文件说明 mv和ldconfig操作在普通用户操作下需要sudo提权 注意 这种方式的修改也是永久有效的如果非必要建议用后删除避免冲突和污染系统环境。 关于动态链接 动态库的链接将可执行程序中的外部符号替换为库中的具体地址在程序执行时直接将库地址加载到内存中只要我们把库加载到内存映射到进程的地址空间中后我们的代码执行库中的方法就依旧还是在自己的地址空间内进行函数跳转当库因为程序调用已经在内存中另一个程序使用时就直接在页表中映射然后在共享空间中调用即可 动态库的方法只需要在内存中存在一份就可以被所有进程使用了库的加载也不一定是全部加载到内存使用什么加载什么就行具体根据操作系统的策略就行操作。 程序在链接动态库函数时是通过 动态库起始地址 所链接函数偏移量 的方式进行链接访问的而这个偏移量就是 fPIC 与位置无关码! 地址就两类绝对编址 and 相对编制 静态链接时将可链接的二进制文件加载至程序中直接通过 绝对地址 进行链接如果函数被调用了多次就会导致代码冗余等问题。 动态链接采用 相对地址 的方式进行链接同一个函数的 动态库起始地址 所链接函数偏移量 值相同代码只需要加载一份并且可以任意位置进行函数调用(与位置无关)。 动态库必定面临一个问题不同的进程运行程度不同需要使用的第三方库不同注定了每一个进程的共享空间中的空闲位置是不确定的 动态库中的地址绝对不能确定去使用绝对编址动态库中的所有地址都是偏移量默认从0地址开始当一个库真正被映射到地址空间时他的起始地址才能真正确定动态库在进程的地址空间中随便加载与我们加载到地址空间的什么位置毫无关系 补充 当同时存在动态库和静态库时编译器默认采用动态库 如果我们想指定生成静态库程序只需要加上 -static 选项即可 \) g [代码文件.cpp] -static #如果是第三方库需要指定头文件,库路径和库名称如果只提供静态库但编译时不加-static编译时会将静态库进行静态链接(结合具体的情况)(将可以动态链接的库动态链接然后将不能动态链接的静态库中代码拷贝到文件中)可以动态链接的库进行动态链接 静态链接生成的程序比动态链接大得多并且内含静态库的动态链接程序也比纯粹的动态链接程序大说明程序不是 非静即动可以同时使用动态库与静态库! 最后 以上就是 【Linux软硬链接和动静态库】 的全部内容了本节我们结束了如同快捷方式一样的软硬链接让我们可以对目标建立链接快速访问同时学习了程序的运行需要库的加持动静态库的区别学习了制作库最后介绍了库的链接原理相信本次的介绍可以帮助各位开发者 本次 Linux软硬链接和动静态库 就先介绍到这里啦希望能够尽可能帮助到大家。 如果文章中有瑕疵还请各位大佬细心点评和留言我将立即修补错误谢谢 其他文章阅读推荐 Linux文件系统概述 -CSDN博客 Linux重定向和缓冲区理解 -CSDN博客 Linux文件理解和系统调用 -CSDN博客 Linux进程控制 -CSDN博客 Linux进程地址空间 -CSDN博客 欢迎读者多多浏览多多支持!
相关文章
-
东莞网站优化公司哪家好建设银行网站怎么基本转个人
东莞网站优化公司哪家好建设银行网站怎么基本转个人
- 技术栈
- 2026年03月21日
-
东莞网站系统找哪里wordpress系统api接口
东莞网站系统找哪里wordpress系统api接口
- 技术栈
- 2026年03月21日
-
东莞网站系统后缀郑州市建设局网站
东莞网站系统后缀郑州市建设局网站
- 技术栈
- 2026年03月21日
-
东莞网站制作建设公司广州自建网站哪家服务好
东莞网站制作建设公司广州自建网站哪家服务好
- 技术栈
- 2026年03月21日
-
东莞网站制作与网站建设网站设计专业公司
东莞网站制作与网站建设网站设计专业公司
- 技术栈
- 2026年03月21日
-
东莞微客巴巴做网站建立购物网站
东莞微客巴巴做网站建立购物网站
- 技术栈
- 2026年03月21日






