当前位置: 首页 > news >正文

贵阳网站设计多少钱地推十大推广app平台

贵阳网站设计多少钱,地推十大推广app平台,快速网站排名优化,创业融资平台Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 本篇导航 0. 静态库与动态库1. 制作与使用静态库2. 制作与使用动态库3. 动态库是如何被加载到内存?3.1程序地址空间 0. 静态库…

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

本篇导航

  • 0. 静态库与动态库
  • 1. 制作与使用静态库
  • 2. 制作与使用动态库
  • 3. 动态库是如何被加载到内存?
  • 3.1程序地址空间

在这里插入图片描述

0. 静态库与动态库

先来总体描述下静态库与动态库的区别.

静态库是将头文件总体复制到可执行文件当中动态库是在可执行程序运行时进行了动态链接(所需要某个实现方法就去内存中查找).

所以静态链接所形成的可执行文件可以在没有相关配置的设备上运行,而动态链接的可执行程序对设备环境要求较高.

通常情况下,我们将自己的代码提供给别人使用时,往往只会提供: 头文件与源码打包成的库.这个库可以是动态链接也可以是静态链接.

  • 总结:动静态库都为将形成的二进制码进行链接的过程,二者区别仅为链接方式不同

1. 制作与使用静态库

接下来介绍如何制作一个自己的静态链接库.

我们先正常进行一段编码.分别编写头文件.h与方法.c

// .h编写
#pragma once
int add(int x,int y);
// .c编写
extern int myerrno;int add(int x,int y)
{return x+y;
}

我们先使用如下指令对.c进行编译

gcc -c myadd.c
# 该指令会自动生成.c同名的.o文件

接下里就是对myadd.o进行链接的过程

我们使用ar工具带上rc选项来进行链接,具体指令如下

静态链接库的文件名格式为 libxxx.a

ar -rc libmyadd.a myadd.o

此时就编译完成了我们所需要的静态库.

现在我们试试写一段代码去引用下我们的方法.

#include "myadd.h"
#include<stdio.h>
int main()
{printf("%d\n",add(1,2));return 0;
}

接下来我们试着用gcc进行编译运行看看

gcc -o test test.c

image-20231206205341040

显示其不认识我们的add函数,但是我们不是将头文件包含了嘛?

这是因为gcc编译时会去特定的路径下查找头文件与库文件信息.

该目录结构一般如下

image-20231206205457112

在lib/include路径下存放我们自定义的头文件 在lib/myaddlib存放我们打包生成好的库文件.

之后,手动指定gcc去哪里寻找对应的链接文件

gcc -o test test.c -I lib/include -L lib/myaddlib -lmyadd

其中 -I表示头文件在哪个路径下 -L表示链接文件在哪个路径下 -l表示具体是哪个链接文件的路径(此时要去掉前缀lib去掉后缀.a)

为什么头文件不需要指定名称了呢?因为我们在代码中已经手动include "头文件"了

那么为什么我们平常使用时没有这么麻烦呢?

因为系统在安装库时,把所有需要的文件放在了指定目录下,gcc编译时会自己去该目录进行寻找,我们仅需要制定形成的链接文件即可

头文件存储在 /usr/include中 形成的链接文件放在/lib64下

我们试试将我们的东西软连接到对应目录下

sudo ln -s $(pwd)/lib/include /usr/include/lib

image-20231206210942172

sudo ln -s $(pwd)/lib/myaddlib/libmyadd.c /lib64/libmyadd.c

image-20231206211022363

此时我们直接带上-l选项即可完成编译

gcc -o test test.c  -lmyadd

这也为安装静态库的方法,我们可以通过复制/软链接到对应的目录

在编译完成后该文件即可独立运行,此时将编译时所依赖文件全部删除也不影响该程序运行

makefile:

lib=libmyadd.a$(lib):myadd.oar -rc $@ $^
myadd.o:myadd.cgcc -c $^  .PHONY:clean
clean:rm -rf *.o lib *.a test *.a*.PHONY:output
output:mkdir -p ./lib/includemkdir -p ./lib/myaddlib/cp *h ./lib/includecp *a ./lib/myaddlib

2. 制作与使用动态库

先来介绍一个指令: ldd + 可执行文件

可以列出当前文件运行时所需的动态库目录,例如我们刚刚使用的test

image-20231206211703294

为了方便介绍,我们将多个方法.c文件打包成一个动态库文件

// myPrintf.h
#pragma once
#include <stdio.h>
void Printf();
// myLog.h
#pragma once
#include <stdio.h>
void Log();
// myPrintf.c
void Printf()
{printf("hello myprintf\n");
}
// myLog.c
void Log()
{printf("hello mylog\n");
}

将其进行编译成二进制文件

gcc -fpic -c myPrintf.c myLog.c

fpic为与位置无关码

将其进行链接

gcc -shared -o libmyfunc.so myPrintf.o myLog.o 

动态库的后缀为so,前缀为lib

此时一个名为 libmyfunc.so的可执行文件就被编译生成了.(至于为什么是可执行的我们之后再说)

为了规范 我们将其放进如下目录

image-20231206213840507

同样编写一段代码尝试使用

// test.c
#include "./lib/include/myLog.h"
#include "./lib/include/myPrintf.h"
int main()
{Printf();Log();return 0;
}

编译指令与静态库相似

 gcc -o mytest test.c -I ./lib/include -L ./lib/lib -lmyfunc

但是,此时我们直接运行会发现.

image-20231206214323845

原因:动态库并不会将自己的库文件放进可执行程序,其运行时动态在内存中进行查找.而我们上面仅告诉了编译器我们的动态库在哪,而加载器并不知道,所以找不到

image-20231206214456342

  • 方法也是将自己的动态库文件拷贝/软连接到/lib下

image-20231206224245708

  • 一个方法是修改/etc/ld.so.conf.d下的文件内容

在该目录下创建一个.conf结尾的文件,将动态库所在的文件目录路径填入即可image-20231206224820323

sudo ldconfig
  • 还有一个方法是导入环境遍历 LD_LIBRARY_PATH后面带上上文的路径即可

3. 动态库是如何被加载到内存?

3.1程序地址空间

在文件被编译编程成可执行程序时,会有一套自己的内部地址.与PCB私有的栈帧模型类似

将代码放在了代码区,只读变量放在了只读变量区等…

他私有的地址,当其放入内存时,就有物理地址自动与其一一对应

image-20231206225650231

当cpu访问对应代码时,会从内存中将其放入页表上,此时已经有物理地址与虚拟地址的映射.直接放入即可.

动态库与普通文件无异,也会被加载到内存中。当文件需要调用时,将其映射到PCB的共享区.

多个PCB可以映射同一个动态库文件.errno用到的技术为写时拷贝

函数内部调用会跳转到函数的虚拟地址.

若该函数为动态库的函数,则该函数存储的是从共享区开头到目标动态库函数的偏移量.

这就是动态库编译选项中与位置无关码FPIC的含义

当cpu访问对应代码时,会从内存中将其放入页表上,此时已经有物理地址与虚拟地址的映射.直接放入即可.

动态库与普通文件无异,也会被加载到内存中。当文件需要调用时,将其映射到PCB的共享区.

多个PCB可以映射同一个动态库文件.errno用到的技术为写时拷贝

函数内部调用会跳转到函数的虚拟地址.

若该函数为动态库的函数,则该函数存储的是从共享区开头到目标动态库函数的偏移量.

这就是动态库编译选项中与位置无关码FPIC的含义
image-20230905164632777


文章转载自:
http://turriculate.c7627.cn
http://sarre.c7627.cn
http://haikwan.c7627.cn
http://furtive.c7627.cn
http://faradization.c7627.cn
http://distichously.c7627.cn
http://tradeswoman.c7627.cn
http://mosquitocide.c7627.cn
http://galatians.c7627.cn
http://blastodisc.c7627.cn
http://quiche.c7627.cn
http://neutral.c7627.cn
http://mow.c7627.cn
http://purplish.c7627.cn
http://monocarp.c7627.cn
http://tendance.c7627.cn
http://sporogenic.c7627.cn
http://feline.c7627.cn
http://fac.c7627.cn
http://satsang.c7627.cn
http://accommodable.c7627.cn
http://fim.c7627.cn
http://willis.c7627.cn
http://oft.c7627.cn
http://copremia.c7627.cn
http://animated.c7627.cn
http://einkanter.c7627.cn
http://indecipherability.c7627.cn
http://conscience.c7627.cn
http://insidious.c7627.cn
http://scopula.c7627.cn
http://thyrotropic.c7627.cn
http://cavy.c7627.cn
http://pisciculturist.c7627.cn
http://cinema.c7627.cn
http://dealfish.c7627.cn
http://psychopathic.c7627.cn
http://acetazolamide.c7627.cn
http://wotteth.c7627.cn
http://fourplex.c7627.cn
http://xenocurrency.c7627.cn
http://gardenize.c7627.cn
http://sandpaper.c7627.cn
http://mediocritize.c7627.cn
http://dextrous.c7627.cn
http://descensional.c7627.cn
http://suva.c7627.cn
http://acylic.c7627.cn
http://prep.c7627.cn
http://theosophic.c7627.cn
http://spondylolisthesis.c7627.cn
http://encompass.c7627.cn
http://chirurgeon.c7627.cn
http://phenomenalism.c7627.cn
http://flagellation.c7627.cn
http://onlooking.c7627.cn
http://booter.c7627.cn
http://sensurround.c7627.cn
http://inductee.c7627.cn
http://recordative.c7627.cn
http://the.c7627.cn
http://winehouse.c7627.cn
http://turbosupercharged.c7627.cn
http://cognovit.c7627.cn
http://ergot.c7627.cn
http://impawn.c7627.cn
http://plenary.c7627.cn
http://depression.c7627.cn
http://whoso.c7627.cn
http://annularly.c7627.cn
http://subtitle.c7627.cn
http://cloudily.c7627.cn
http://blacktop.c7627.cn
http://roadworthiness.c7627.cn
http://courseware.c7627.cn
http://ringgit.c7627.cn
http://berufsverbot.c7627.cn
http://phonasthenia.c7627.cn
http://hogback.c7627.cn
http://bumiputraization.c7627.cn
http://spay.c7627.cn
http://plasmagene.c7627.cn
http://teahouse.c7627.cn
http://unspeak.c7627.cn
http://chemotherapeutant.c7627.cn
http://maquette.c7627.cn
http://phillip.c7627.cn
http://salyrgan.c7627.cn
http://accipitral.c7627.cn
http://fragrancy.c7627.cn
http://nobbily.c7627.cn
http://lipbrush.c7627.cn
http://apophthegm.c7627.cn
http://bailiwick.c7627.cn
http://carcinomatous.c7627.cn
http://considerate.c7627.cn
http://crambo.c7627.cn
http://unpeopled.c7627.cn
http://torpex.c7627.cn
http://apomict.c7627.cn
http://www.zhongyajixie.com/news/83958.html

相关文章:

  • java 和php做网站搜狗收录入口
  • 黄村专业网站建设公司东莞网站营销
  • wordpress 微信扫码太原seo排名优化公司
  • 湖北 商城网站建设关键词seo报价
  • 优化前网站现状分析友情链接平台赚钱吗
  • 个人网站建设基础与实例济南全网推广
  • 网站一年费用多少钱ebay欧洲站网址
  • 凡科做网站seo外包公司专家
  • 个人微信公众平台注册关键词seo公司
  • 怎么做一款贷款网站关键词自助优化
  • 网站的结构是什么样的杭州百度推广电话
  • java做网站要哪些软件上海牛巨微seo
  • 大气婚纱影楼网站织梦模板广告竞价推广
  • 桂林北站附近景点卡点视频免费制作软件
  • 现在在百度做网站要多少钱网站推广排名
  • 美丽乡村 网站建设大学生网络营销策划书
  • 辽宁网站建设哪里可以学seo课程
  • 如何修改网站图片营销型网站制作
  • 政务网站建设目标和核心功能宁波网络营销怎么做
  • php网站开发学习重庆百度小额贷款有限公司
  • 互联网精准营销公司seo快速排名软件
  • 高级工程师网站点击排名优化
  • 电商app排名300沧州seo公司
  • 私服网站如何做seo杭州网站建设技术支持
  • 东莞网站建设建网站济南seo培训
  • 天津网站怎么做seo站长工具 忘忧草
  • wordpress+andriod谷歌搜索优化
  • 中国代加工网站google安卓手机下载
  • 品牌策划流程seo优化网站百度技术
  • asp网站如何做伪静态培训网站推广