Linux之软硬链接和动静态库

news2024/11/26 11:34:41

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶      算法   C++进阶

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.软硬链接

1.1如何软硬链接

 1.2软硬链接的作用

1.2.1软链接(快捷方式)

1.2.2硬链接(备份)

1.2.3 mkdir计数为什么为2

二.动静态库

2.1基础储备

2.2静态库

2.2.1创建静态库

2.2.2静态库的安装删除和使用

2.3动态库

2.3.1动态库的创建

2.3.2动态库的使用

2.3.2.1动态库使用常遇到的问题

2.3.2.2解决动态库执行找不到库的问题

2.3.2.2.1安装到系统的库中

2.3.2.2.2环境变量

2.3.2.2.3修改配置文件

2.4动态库加载---可执行程序和地址空间 


一.软硬链接

1.1如何软硬链接

  软链接的建立的指令如下:

ln -s mystdio.c mystdio.link

输入

ll -i

硬链接的建立如下:

ln mystdio.c mystdio_hard.link

输入

ll -i

 1.2软硬链接的作用

1.2.1软链接(快捷方式)

        在上面可以看到

mystdio.c和mystdio.link的inode的号不同,这个软链接有什么用呢?软链是一个独立的文件。因为它有一个独立的inode number,软链接的内容是目标文件所对应的路径字符串,它类似于windows的快捷方式

1.2.2硬链接(备份)

同样在硬链接中它的inode number和mystdio.c相同,所以它不是一个独立的文件,因为它没有独立的inode number,硬链接就是一个文件名和inode的映射关系,它还有一个2,这个就是表示用这个inode number,它相当于一个智能指针,它们指向同一块内存,当删除一个,这个2就变成1

它先当与,其实这个硬链接就相当于一个备份。

注意硬链接不能链接目录。当对目录进行硬链接可以看到

为什么呢?如果可以,当操作系统进行搜索到这个文件,所以它就会回到哪里,例如root.link是根目录进行硬链接,放在code目录中,当运行到这里就又会回到根目录就会造成回路。

1.2.3 mkdir计数为什么为2

创建一个test文件夹

 为什么???test目录本身一个,它的inode number 266335,进入test

其中的.文件也是 266335,它也是指向本身,所以它的计数为2.

二.动静态库

2.1基础储备

        在平时我们使用动静态库吗??使用果,而且经常使用,输入指令

ll /usr/lib64

可以看到内置的库,在一个可执行程序中,可以输入指令

ldd a.out

既可以看到a.out所用到的库 

在Linux中动态库的后缀是.so,静态库的后缀是.a。对于动静态库我们需要知道它是他如何制作会让如何使用。

2.2静态库

2.2.1创建静态库

生成静态库的指令(其中.c不包括main函数)

gcc -c *.c
ar -rc libmyc.a *.o

其中-c会直接生成同名的.o文件,它就会生成一个libmyc.a,这就是我们的静态库,当别人想要时我们给他提供这个静态库和.h它自己写main函数就可使用了。

2.2.2静态库的安装删除和使用

下面是情景模拟: 当获取了.h和静态库后

写一个main函数

#include "mymath.h"
#include "mystdio.h"

int main()
{
    printf("%d\n",Add(1,2));
    return 0;
}

 当我们想生成可执行程序时需要输入指令

gcc main.c libmyc.a

当然可以将这个库和.h进行安装,看安装过程:

sudo cp libmyc.o /usr/lib64
sudo cp *.h /usr/include

输入完成后就好了,当想使用gcc直接想生成可执行程序时发现

这是因为我们自己安装的属于第三方库,如果想要使用需要输入指令:

gcc main.c -lmyc

但是非常不建议这样做,因为我们自己写的尽量不要安装到lib64中,我们删除,可以使用下一种方法:

卸载指令:

sudo rm -rf /usr/lib64/libmyc.a /usr/include/mystdio.h /usr/include/mymath.h

可以创建一个mylib的文件夹,然后再往里面添加目录include和lib,将.h和.a分别放入其中,结果如图:

我们生成可执行程序输入指令

gcc main.c -I mylib/include -L mylib/lib -lmyc

为什么没有头文件的名称??其实在代码中就包含了头文件的名称。

2.3动态库

2.3.1动态库的创建

生成动态库需要输入指令:

gcc -fPIC -c*.c
gcc -shared *.o -o libmyc.so

就会生成:

2.3.2动态库的使用

2.3.2.1动态库使用常遇到的问题

将libmyc.so安装到mylib中

输入指令进行编译:

gcc main.c -I mylib/include -L mylib/lib -lmyc

运行后可以看到报错:

这是为什么?输入指令:

ldd a.out

 libmyc.so是刚刚安装上的,,为什么会找不到?这是因为只是告诉了gcc/g++没有告诉操作系统只有编译阶段有,运行阶段没有,为什么静态库就不需要???事实上静态库在编译阶段就将库拷贝到可执行程序中了,这也是为什么静态库生成的可执行程序占用的内存大。既然库文件有静态库也有动态库,它们俩的指令一样,为什么会先用动态库呢???这就是动静态库的规则,默认情况下是先用动态库,没有动态库才会使用静态库。当假如-static选项时会使用静态库,看指令:

gcc main.c -I mylib/include -L mylib/lib -lmyc -static

查看此时使用的库

没有。

2.3.2.2解决动态库执行找不到库的问题
2.3.2.2.1安装到系统的库中

安装:

sudo cp mylib/include/*.h /usr/include
sudo cp mylib/lib/*.so /usr/lib

 执行:

ldd a.out

2.3.2.2.2环境变量

在家目录中进入.bashrc进行修改

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/yang/linux/code/roommate/mylib/lib
2.3.2.2.3修改配置文件

ls /etc/ld.so.conf.d

在里面加入

/home/yang/linux/code/roommate/mylib/lib

最后输入

idconfig
2.3.2.2.4软链接
ln -s /root/linux/code/roommate/mylib/lib/libmyc.so /lib64/libmyc.so

 注意一定要完整的路径

2.4动态库加载---可执行程序和地址空间 

在一个进程中动态库加载到内存后libmyc.so映射到页表,然后加载到进程地址空间的共享区,当调用时再到共享区call这个库。当有一个新的进程用到libmyc.so库时它不会在内存中再次加载这个库。 

可执行程序加载到内存,就会有物理地址,也就会有虚拟地址,在cpu中有一个pc指针(pc指针能得到main函数的入口地址),页表映射找到可执行程序。

 code.exe执行到myAdd,当执行到libmyc.so的函数时,到共享区查看有没有加载这个库(库有没有加载??先描述在组织),有的话就去寻这个函数地址(虚拟地址+地址偏移量),然后运行。。

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

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

相关文章

ViP-LLaVA: Making Large Multimodal Models Understand Arbitrary Visual Prompts

发表时间:cvpr2024 论文链接:https://readpaper.com/pdf-annotate/note?pdfId2357936887983293952&noteId2426262228488986112 作者单位:University of Wisconsin–Madison Motivation:现在的多模态模型都关注整张图像的理…

html+css网页设计 qq官网首页1个页面无js

htmlcss网页设计 qq官网首页1个页面无js功能 页面1:1还原 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 …

冲击性信号的频域特征

这是一个信号采样数学实验,你可以直观感受到冲击信号的时域和频域特征 1.原始冲击信号: 原始信号是一个频率为180Hz附近的一个冲击性信号: 2.冲击信号频谱 它的频谱,可能会超出你的想象,它的1x频率幅度可能并不最高…

iOS ------ autoreleasePool

一,autoReleasePool{} int main(int argc, const char * argv[]) {autoreleasepool {}return 0; }我们平时创建一个main函数的代码的时候,就会发现其中有一个这个东西autoreleasepool{},使用clang编译之后:autoreleasepool{…}被…

对《国家汽车芯片标准体系建设指南》好奇,遂读

基础通用:基于汽车行业对芯片的可靠性、运行稳定性 和安全性等应用需求,提取出汽车芯片性通用要求,主要包括环境及可靠性、电磁兼容、功能安全和信息安全共4个方面的要求。 产品与技术应用:根据实现功能的不同,将汽车…

文献综述能否帮助研究人员认识特定学术领域的趋势和新兴主题

VersaBot一键生成文献综述 进行良好的文献综述可以成为研究人员识别特定学术领域的趋势和新兴主题的强大工具。就是这样; 1. 识别模式和重复出现的概念: 当您深入研究现有研究时,您自然会开始注意到不同研究中采用的重复出现的主题、想法和方法。这些模…

详解爬虫使用代理ip的几种方案

​ 在如今这个信息爆炸的时代,数据就是财富。对于许多从事数据分析、市场调研和大数据处理的人来说,网络爬虫已经成为了他们的得力助手。然而,随着网站对爬虫的防范措施越来越严格,使用代理IP已经成为了爬虫工作中的一项必备技能。…

05:【stm32】重映射AFIO

重映射AFIO 1、什么是AFIO2、怎么使用AFIO 1、什么是AFIO AFIO是stm32上的众多片上外设之一,专门用来执行“复用功能的重映射” 2、怎么使用AFIO 如下图所示:当我们要同时使用USART1和TIM1时,我们就需要使用AFIO进行使其中一个片上外设进行重…

【iOS】SideTable

目录 SideTablesStripedMapSideTable1. spinlock_t slock2. RefcountMap3. weak_table_t 总结 objc4源码地址: SideTable& table SideTables()[this]; // 获取对象的SideTable size_t& refcntStorage table.refcnts[this];SideTables 查源码SideTables…

Android 多语言切换

文章目录 在系统设置修改语言创建资源目录创建资源文件示例验证 代码手动切换语言在Application中设置新的语言环境在MainActivity / BaseActivity中设置新的语言环境验证 问题1. makeText()方法context传入是Application的context,无法获取正确的资源字符串原因解决…

Docker + Nacos + Spring Cloud Gateway 实现简单的动态路由配置修改和动态路由发现

1.环境准备 1.1 拉取Nacos Docker镜像 从Docker Hub拉取Nacos镜像: docker pull nacos/nacos-server:v2.4.01.2 生成密钥 你可以使用命令行工具生成一个不少于32位的密钥。以下是使用 OpenSSL 生成 32 字节密钥的示例: openssl rand -base64 321.3 …

免费插件集-illustrator插件-Ai插件-选择路径等分

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,路径处理功能,功能是选择路径等分。首先从下载网址下载这款插件 https://download.csdn.net/download…

本地Gitlab-runner自动编译BES项目

0 Preface/Foreword 1 Gitlab-runner配置情况 具体情况如下: Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户,名为gitlab-runner 2 自动编译 2.1 找不到编译工具链 根据错误提示,交叉编译工具链未找…

Springboot利用大模型实现即时通信

gitee地址:https://gitee.com/myha/Springboot-langchain-chat 版本及工具说明 本项目版本:springboot3.2.8 jdk17 mybatis-plus3.5.7 安装python,可以参考:https://docs.python.org/zh-cn/3/using/windows.html#the-full-in…

zsh 配置 docker 自动补全

zsh 配置 docker 自动补全 在终端中使用 docker 的命令的时候必须要全部手敲,没有提示,于是就在找是否有自动补全的脚本,搜索了一圈踩了一些坑总结了一下具体的步骤。 首先执行如下命令: mkdir -p ~/.zsh/completion curl -L h…

Visual Studio创建 OpenCV项目

1、cmake 编译 opencv 参考链接:CMake编译OpenCV3.4.1心得_cmake 3.4.1-CSDN博客 1)opencv文件名最好不要有空格 2)没有下载opencv_contrib,不用配置OPENCV_EXTRA_MODULES_PATH 1、Visual Studio创建 OpenCV项目 参考链接&am…

esp32通过smartconfig连接wifi

esp32通过smartconfig连接wifi整体设计流程 1.流程图 2.代码实现 #include <WiFi.h> #include <SPIFFS.h>// 定义存储文件的文件名 const char* wifi_config_file "/wifi_config.txt";// 定义变量存储 WiFi 信息 // 1&#xff09;不填写为空时通过sma…

LangGraph Studio

文章目录 一、关于 LangGraph Studio下载 二、设置三、打开一个项目三、调用图开始新的运行配置图运行 四、创建和编辑线程1、创建一个线程2、选择一个线程3、编辑线程状态 五、如何向图表添加中断1、将中断添加到节点列表2、向特定节点添加中断 六、Human-in-the-loop七、编辑…

多模态大模型intern-vl 1.5 论文解读:How Far Are We to GPT-4V?

论文&#xff1a;https://arxiv.org/pdf/2404.16821 目录 1 介绍 3.1 整体架构 3.2 强大的视觉编码器 InternViT-6B-448px-V1.2 InternViT-6B-448px-V1.5 3.3 动态高分辨率 动态宽高比匹配 图像分割与缩略图 InternVL 1.5&#xff0c;这是一款开源的多模态大语言模型&…

Onenet服务器创建产品和设备

Onenet服务器创建产品和设备 (1)浏览器搜索 Onenet, 或者打开这个网址 OneNET - 中国移动物联网开放平台 (10086.cn) (2)登录注册, 密码特殊符号是 (3)进入此网址, 设备管理页面 设备列表 - OneNET物联网平台 (10086.cn) (4)点击产品开发,创建产品 (5)其他行业 (6)设备接…