首页 > 系统相关 >漫话linux:基础IO,软硬链接,动静态库管理

漫话linux:基础IO,软硬链接,动静态库管理

时间:2024-09-15 16:23:11浏览次数:10  
标签:文件 静态 int add IO linux main 链接 漫话

1.软硬链接

        1.软链接:是一个独立文件,具有独立的 inode ,也有独立的数据块,它的数据块里面保存的是指向的文件的路径,公用 inode

                1.建立软连接

ln -s 目标文件或目录,链接名

 

目标文件或目录表示路径,链接名代表命令,无论在哪里输入命令就能调用该程序 

                2.建立硬链接

硬连接的两个文件 inode 是一样的,不是一个独立的文件,本质其实就是在特定目录的数据块中新增,文件名和指向的文件的 inode 编号的映射关系

ln建立链接,由后者指向前者,硬链接数

观察 inode 编号可以发现,软硬链接的区别:是否具有独立的Inode

软链接具有独立的Inode:可以被当作独立的文件看待

        2.硬链接:任意一个文件,无论是目录,还是普通文件,都有 inode,每一个 inode 内部,都有一个叫做引用计数的计数器,有多少个文件名指向我,通常用来进行路径定位,采用硬链接,可以进行目录间切换,通过实践我们可以发现,创建目录会发现硬链接数会增加,删文件就是解除映射关系,连接数--,所以硬链接不会一次被删除

        3.硬链接的应用:

一个硬链接. 表示当前目录,inode 是一样的,相当于在另一个场景下的重命名,..为 3,返回的是上级路径的 inode

eg: / 硬链接数为 21,可知旗下有 19 个目录(1个自己,1个父目录,剩下全是子目录)

        4.linux不能对目录进行硬链接,./调用是系统建立好的,目的就是防止硬链接闭环,造成混乱

        5.软链接:网址就是一个典型的软连接,点一下路径直接跳转,当程序过于复杂路径过于深的时候,直接通过软连接访问目标文件,软链接有自己独立的Inode和内容,当我们删除指向文件,软链接就出错,但是我们知道Inode还在。换一个角度思考,怎么不算是一种置后的重命名呢,软链接里面保存的是与文件所处路径的映射关系,当把文件删除时,这个映射关系就出错了。unlink 的使用,

        6.对文件的权限最终解释权归目标文件,软连接不能影响,软连接可以和之后的动态库结合使用

2.动静态库

        1.静态库(.a结尾):程序在编译链接的时候把库的代码拷贝到可执行文件中。程序运行的时候将不再需要静态库,形成可执行程序太大

        2.动态库(.so结尾):程序在运行的时候才去加载动态库的代码,多个程序共享使用库的代码,受到库升级或被删除等影响

        3.命名:例如动态库 libxxx.so,lib前缀 .so后缀 去掉前缀和后缀,剩下的就是库名称

        4.使用:在Linux中,动态链接和静态链接是链接器在编译程序时使用库的不同方式。动态链接器在运行时加载共享库(通常带有 .so 后缀),而静态链接器在编译时将库的代码直接合并到可执行文件中(通常带有 .a 后缀),在Linux中使用GCC编译静态链接的可执行文件

gcc test.c -o mytest -static

        5.注意:

                1.如果系统中只提供.so文件,则只能使用动态链接

                2.如果只提供.a文件,即使不指定-static,也是静态链接

                3.如果动态库和静态库都存在,默认使用动态库

        6.安装c静态库:

        

sudo yum install -y glibc-static

        7.安装c++静态库

sudo yum install -y libstdc++-static

         8.关于linux静态库的问题

                1.在windows下,原理是一样的

                2.默认形成可执行程序:动态链接

                3.windows下动态库后缀为.dll静态库后缀为.lib

                4.系统本身为了支持编程,除了提供标准库.h,还提供了标准库的实现.so/.a

3.库:程序在经过预处理,编译,汇编,之后,就要链接了,链接就是将.o文件和库链接起来形成可执行程序

        1.vim小技巧:在 Vim 编辑器中,使用:vs(vertical split)命令可以创建一个垂直分割的窗口。若要在这两个窗口之间切换,可以使用下面方法:在 Vim 中,ctrl+w是一个前缀键,用于执行与窗口相关的操作,而j,k,h,i 键用于指定方向

        2.库的链接:

                1.下面是一个简单的示例,展示了如何编写一个 add 函数,并且如何将它们编译成目标文件(.o 文件),最后将这些目标文件链接起来形成一个可执行文件。
首先,我们需要创建 2 个源文件:my_add.c(包含add函数的实现),main.c(包含main函数,调用add函数)

                2.add.c

#include<stdio.h>
#programe once//防止头文件被重复包含
int add(int a, int b) {
    return a + b;
}

                3.main.c

// main.c
#include <stdio.h>
extern int add(int a, int b);
int main() {
    int a = 10;
    int b = 5;
    printf("Add: %d + %d = %d\n", a, b, add(a, b));    
    return 0;
}

extern 告诉编译器 add 函数存在,但它的定义(函数体)在其他地方

现在,我们将这些源文件编译成目标文件,并链接它们来创建一个可执行文件

                4.编译和链接步骤

在命令行中运行:

gcc -c add.c -o add.o  
gcc -c main.c -o main.o      
gcc -o testk main.o add.o 

最后,运行可执行文件mypath

./testk

        5.生成库

                1.生成静态库,以达到保密封装的作用,方法:可以先将.h 和.c 打包成 .o,库的原理和上面类似,只是将所有的.o为后缀的文件打包在了一起,形成了一个库,在使用的时候直接使用这个库就可以,指令为ar -rc libname.a[所有待打包.o],将所有.o文件制作成静态库,该指令中,ar是gnu的归档工具(Archive files),rc表示replace和create

这是错误的,因为库一般不包含main.o函数,一般由用户自己写程序调用

 

                2.一步到位方法

libmylib.a:add.o
	ar -rc libmylib.a add.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:subc
	gcc -c sub.c -o sub.o
 
.PHONY:output
output:
	mkdir -p myliba/include
	mkdir -p myliba/lib 
	cp -f *.h myliba/include
	cp -f *.a myliba/lib 
.PHONY:clean
clean:
	rm -rf *.o libmylib.a myliba

我们可以写一个这样的Makefile,直接一步make到位,生成一个库文件,将所用到的头文件全部放在myliba/include目录下,将静态库文件放在myliba/lib目录下

                3.通过指令来查看我们制作的库:ar -tv库文件名,再使用打包工具tar,将库和头文件一起打包

用tar czf打包了一个myk.tgz 

        6.使用库(方法一)(要提供文件的)

                1.库的安装:头文件默认搜索路径:/usr/include,库文件默认搜索路径:/usr/lib64

                2.gcc不知道该用这个默认路径下的哪个库,要告诉编译器使用该库

                3.在使用gcc编译的时候告诉编译器要使用的库名(掐头去尾后的库名),此时就能编译成功了

                4.-I选项:指定使用的库名(掐头去尾后的库名),注意:l可以和名字合在一起,如-lmylib

                5.这种方式不建议使用,因为第三方库没有经过检测,会污染其他库和头文件

        7.方法二,用这个

                1.告诉编译器头文件路径,库路径,库名

1.解压

tar -xzf myk.tgz

 2.gcc-o -l头文件路径 -L库文件路径

上文忘了创建包含函数声明的头文件,并需包含在main.c中,导致后面无法链接,抱歉

#include<add.h>
int add(int x,int y);

以下为重新制作的演示程序

 

调用命令cp *.h(找寻所有以.h为结尾的文件)../classmate/

 

 

cp(复制)*(通配符).h(所有带.h的)  ..(回退到上一级目录)/classmate/在上一级目录里找

 编译一下

 静态库制作完成

第二种方法:

所用到的头文件全部放在myliba/include目录下

静态库文件放在myliba/lib目录下

 

ku2.a已创建 

目录myku2已创建 

打包

 

使用:

1.在windows或linux中导航到压缩的tgz文件所在的目录,再输入该命令解包

 

 

 编译:main文件的编译:1.main.c文件(用户自己写),-I头文件路径,-L库文件路径 库名

 

现在可以正常使用了

        8.动态库       

                1.形成位置无关码

      

 生成一个叫moveadd.so的动态库文件

已生成 

位置无关码就类似于箭头右侧30米处的30。 本质上它是一个偏移量,相对于库基地址的偏移量 ,如果这不是100米的跑道,而是变成了200米,500米呢?星星的绝对位置会变化,但是它的相对位置永远不变,处于箭头右侧30米处        

如果安装还用sudo(就是把静态库文件换成动态库文件)

使用的格式和静态库完全一样(记得去除前后缀)

如果不在标准库中,需要使用环境变量来使用动态库:

export LD_LIBRARY_PATH=~/mylibs:$LD_LIBRARY_PATH  
./your_program

       如果你的动态库位于 ~/mylibs 目录中,你可以使用以下命令来设置 LD_LIBRARY_PATH 并运行你的程序

       

        

                

              

标签:文件,静态,int,add,IO,linux,main,链接,漫话
From: https://blog.csdn.net/whcwhc111111/article/details/142106845

相关文章

  • Visual Studio 2022 快捷键
    Ctrl+E+C注释代码Ctrl+E+U取消注释代码Ctrl+E+D格式化全部代码Ctrl+Shift+A新建类Ctrl+R+G删除无效UsingCtrl+H批量替换Ctrl+G跳转到指定行Ctrl+E+E在交互窗口中运行选中代码(很实用)Alt+Enter快速引用shift+F9监控(代码运行时)shift+F6生成(当前类库)F6......
  • httpclient PoolingHttpClientConnectionManager 连接池使用举例
    1.1TIME_WAIT状态连接的原因和解决策略大量短连接大量短暂的连接会导致短时间内生成大量的TIME_WAIT状态连接。解决方案:尽量使用长连接,减少连接的创建和销毁次数。TCP时间等待池溢出如果服务器短时间内有大量的连接进入TIME_WAIT状态,可能会导致TCP时间等待池溢出。解决方案:可以......
  • 记录工作中常用到的linux 命令
    sudoreboot        重启机器sudovim/etc/rc.local修改自启动文件./                  代表目前所在的目录。../                 代表上一层目录。/                   代表根目录cd..     ......
  • windows和linux系统
    1.Windows操作系统及软件Windows操作系统是1985年美国微软公司研发的操作系统,分为32位和64位。微软开发的软件包含:office系列办公软件,word,PowerPoint,Excel,access等,在Windows操作系统中可执行文件是以.exe为扩展名。1. Linux操作系统Linux全称为GNU/Linux,是一种免费使用和自由传播......
  • Linux操作系统入门(二)
    完成了前篇所进行的VMware下载安装,并在其内配置了CentOS7的linux操作系统之后,我们得以正式进入了Linux的世界。一.安装FinalShell在本篇中,为了更好的在Windows系统上对虚拟机中的linux操作系统进行操作,我们需要下载一款新的应用程序————FinalShell(其官网如下所示)。ht......
  • IO多路复用
    I/O模型指的是操作系统处理输入/输出(I/Oinput/output)操作的不同方式,它们主要在于如何处理程序与I/O操作设备(如磁盘、网络等)之间的交互,以及在等待I/O操作完成时,程序如何调度和管理。常见的IO模型有:阻塞IO非阻塞IOIO多路复用异步IO 阻塞IO最基础的IO模型,简单调用read()......
  • Linux操作系统入门(三)
    _______________________________________________一.Linux操作系统的文件结构相比于Windows操作系统的C,D,E等盘符,Linux操作系统仅有一个"/"符号的根目录.这其中存在一个显著的不同,Linux操作系统使用的是斜杠"/",而Windows操作系统中使用的是反斜杠"\"文件路径示例:"/Mus......
  • CentOS7永久关闭防火墙和SELinux
    目录一.查看防火墙的状态命令(1)systemctlstatusfirewalld      查看当前的防火墙状态 二.暂时/永久关闭防火墙命令(1)systemctl stopfirewalld        暂时关闭防火墙(2)systemctl disable firewalld        永久关闭防火墙 (需要重......
  • nginx 安装服务后,启动报:An attempt was made to access a socket in a way forbidden
    1、nginx1.18.0安装服务成功后,启动服务的时候,一闪直接报错:2、查看Nginx的日志error.log发现启动一次报一条错,并且都是一样的:2024/09/1414:42:18[emerg]6852#6280:bind()to0.0.0.0:80failed(10013:Anattemptwasmadetoaccessasocketinawayforbiddenbyit......
  • Linux内核开发环境-使用GDB调试内核代码
    建议点击这里查看个人主页上的最新原文作者:陈孝松主页:chenxiaosong.com哔哩哔哩:陈孝松课程:chenxiaosong.com/courses博客:chenxiaosong.com/blog贡献:chenxiaosong.com/contributions邮箱:[email protected]交流群:544216206,点击查看群介绍点......