精华内容
下载资源
问答
  • 静态文件和动态文件

    2021-01-17 16:42:01
    静态文件和动态文件 1.文件存放在块设备(磁盘)的文件系统中的文件中,我们称之为静态文件。文件存放在内存中,我们称之为动态文件。 2.当程序open一个文件时linux内核会做以下操作:首先内核会建立一个打开文件的...

    静态文件和动态文件

    1.文件存放在块设备(磁盘)的文件系统中的文件中,我们称之为静态文件。文件存放在内存中,我们称之为动态文件。

    2.当程序open一个文件时linux内核会做以下操作:首先内核会建立一个打开文件的数据结构(包含文件描述符,节点信息等),记录我们打开的文件。然后会向内存申请一段内存,并且将静态文件里面的内容从块设备读取到内核中特定地址管理存放。

    3 当打开文件后,对文件进行读写操作,都是在内存中这一份动态文件进行操作,而不是针对静态文件。此时修改动态文件的内容,并不会影响静态文件里面的内容,两者是不同步的。当close文件时,close内部的内核会将动态文件里面的内容更新到块设备的静态文件中。

    4 为什么要这样设计?不直接对块设备进行操作?
    因为块设备的读写速度相对内存慢,是按块为单位进行操作,不灵活。而内存是按字节为单位进行操作的,而且可以随机操作,很灵活。

    展开全文
  • so 动态文件和静态库文件区别 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)。 ELF文件分类 ELF文件格式包括三种主要...

    so 动态库文件和静态库文件区别

    在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)。

    ELF文件分类

    ELF文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库:
    1、可执行文件(应用程序)
    可执行文件包含了代码和数据,是可以直接运行的程序。
    2、可重定向文件(.o)
    可重定向文件又称为目标文件,它包含了代码和数据(这些数据是和其他重定位文件和共享的object文件一起连接时使用的)。
    .o文件参与程序的连接(创建一个程序)和程序的执行(运行一个程序),它提供了一个方便有效的方法来用并行的视角看待文件的内容,这些*.o文件的活动可以反映出不同的需要。
    Linux下,我们可以用gcc -c编译源文件时可将其编译成*.o格式。
    3、共享文件(*.so)
    也称为动态库文件,它包含了代码和数据(这些数据是在连接时候被连接器ld和运行时动态连接器使用的)。动态连接器可能称为ld.so.1,libc.so.1或者 ld-linux.so.1。

    动态链接库和静态链接库的区别

    动态链接库就像是python 中的库一样,但是事程序实时调用的二进制文件,静态链接库就像是一个不可移动的库文件,很多的数据都能在其中找到,因此叫做静态数据库。

    静态库

    生成xxx.o文件

    gcc -c xxx.c
    

    将.o文件转化成.a ,利用ar命令,生成xxx.a的静态文件

    ar crs xxx.a xxx.o
    

    so.PNG
    生成了静态的库文件,同时可以将多个二进制的文件进行组装到一个静态库中。
    同时可以使用ar -t 来查看静态库中拥有哪些obj文件
    然后我们可以使用

    gcc -o xxx xxx.c -L, -xxx
    

    -L 表示当前文件夹下面,xxx代表了刚才生成的静态库文件名称。

    动态库

    动态库是程序运行时加载的库,只有在动态链接正确安装之后,所有的程序就可以使用动态库来运行程序,动态库是目标文件的集和,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对的,每次调用都有可能产生新的地址,可以利用puts等函数来读出地址,进行漏洞调用。
    利用.o文件创建动态链接库:

    fs@ubuntu:~/qiang/lib/dylib$ gcc -fPIC -Wall -c dy1.c dy2.c
    fs@ubuntu:~/qiang/lib/dylib$ gcc -shared -o libtest.so dy1.o dy2.o
    fs@ubuntu:~/qiang/lib/dylib$ 
    

    这里的 -fPIC 指创建与地址无关的编译程序, -share 生成动态链接库。
    下面我们就能够使用动态链接:

    fs@ubuntu:~/qiang/lib/dylib$ gcc -o test main.c -L. -ltest
    fs@ubuntu:~/qiang/lib/dylib$ ls
    dy1.c  dy2.c  libtest.so  main.c  mylib.h  test
    

    这里的l 是动态库的调用规则,因为linux系统的动态库命名方式是lib*.so 所以这里*代表了自己的库名。
    直到这里我们依然无法利用动态链接库来进行程序运行,因为程序没有找到动态链接库,这里有三种解决方法,
    1.将动态链接库放到 /usr/lib/以及/lib目录下

    cp libtest.so  /lib
    

    详细链接

    展开全文
  • 动态编译和静态编译;Linux制作动态和静态库 命名规则 静态库命名规则如下: libxxx.o lib:前缀 .o:静态库 动态链接库(shared object file,共享对象文件)命名规则如下: libxxx.so lib:前缀 .so:动态动态库....

    参考链接

    GCC生成动态链接库(.so文件):-shared和-fPIC选项
    GCC创建和使用静态链接库(.a文件)
    gcc的使用方法;动态编译和静态编译;Linux制作动态库和静态库

    命名规则

    静态库命名规则如下:
    libxxx.o
    lib:前缀
    .o:静态库
    动态链接库(shared object file,共享对象文件)命名规则如下:
    libxxx.so
    lib:前缀
    .so:动态库

    静态库参数

    在这里插入图片描述

    gcc 常用编译选项

    在这里插入图片描述

    动态库和静态库的对比

    我们先来说一下静态库;
    Linux下的静态库是以.a结尾的二进制文件,它作为一个程序的模块,它在链接期间就被组合到了程序中,比如说我有一个主程序mian.c,那么我把它和静态库链接的时候,它就直接把这个静态库组合到了我的main.c里面生成的一个二进制文件.a。
    而与静态链接库相对的是动态链接库,同样的是把主函数mian.c和动态库进行链接,与静态库不同的是,这个动态库在程序运行的阶段才会被加载进内存,参与主函数运行
    下面用几张图来说明一下:
    在这里插入图片描述
    在这里插入图片描述

    还可以加上-static选项,让链接静态库后的math.out彻底的独立起来,“完全静态”,因此,得到的二进制文件会非常大。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    使用静态/动态链接库的优缺点:

    静态库:

    编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译
    静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在并且需要通过“-L”参数传递给编译器,应用程序在开始执行时库函数代码将随程序一 起调入进程内存段直到进程结束,其执行过程不需要原静态库存在。

    动态库:

    动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便
    不同的INIX系统链接动态库方法,实现细节不一样,编译PIC型.o中间文件的方法一般是采用C语言编译器的-KPIC或者 -fPIC选项
    最主要的是GCC命令行的一个选项:
    -shared:该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类
    型的导出符号) ,不用该标志外部程序无法连接。相当于一个可执行文件
    -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

    制作链接库的目的(商业角度):

    这就和商业项目挂钩了:
    假如我们是一个项目的外包方,我们是有专利的,希望别人使用我们已经实现的功能,但又不希望别人看到我们的源代码,所以这对商业机构是非常友好的。

    Makefile中的使用实例:

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • makefile生成动态和静态文件

    千次阅读 2018-01-08 18:27:20
    编写程序实现两个整数相加、相减操作 1、文件分布(xiangjian....3、将相加功能相减功能生成静态库(.a)和动态库(.so) 此时我的makefile文件内容为: all:math libmymath1.a libmymath2.so math:main
    编写程序实现两个整数相加、相减操作
    1、文件分布(xiangjian.cxiangjian.hxiangjia.cxiangjia.hmain.c
    2、编写makefile进行编译
    3、将相加功能和相减功能生成静态库(.a)和动态库(.so

    此时我的makefile文件内容为:

    all:math libmymath1.a libmymath2.so
    math:main.c ./mymath/xiangjia.c ./mymath/xiangjian.c
    	gcc main.c ./mymath/xiangjia.c ./mymath/xiangjian.c -o math -I ./mymath
    libmymath1.a:./mymath/xiangjia.c ./mymath/xiangjian.c
    	ar cr libmymath1.a ./mymath/xiangjia.c ./mymath/xiangjian.c
    libmymath2.so:./mymath/xiangjia.o ./mymath/xiangjian.o
    	gcc -c ./mymath/xiangjia.c -o xiangjia.o && gcc -c ./mymath/xiangjian.c -o xiangjian.o && \
    gcc -shared -fPCI -o libmymath2.so ./mymath/xiangjia.o ./mymath/xiangjian.o

    因为要生成三个不同的文件,所以加了一个all目标文件,包含三个文件的依赖,在生成静态库的时候,直接用*.c文件生成即可,但是在生成动态库的时候要用*.o文件生成,而且要注意,不能同时生成两个*.o文件;


    展开全文
  • 前言 bin文件夹里面放的都是dll文件; lib文件夹里面放的都是伴随...staticlib文件夹里面放的才是真正的静态lib文件dll文件是独立的;(这种方式目前已经逐渐被抛弃) 静态lib文件 静态lib文件实际上...
  • 按照自己的理解画的动态链接和静态链接的关系。在Linux下 应该是这样的,个人理解在Vxworks平台上是没有动态链接的,但是.o或者.out文件可以使用vxWorks的loader(loadLib)动态加载到vxworks的镜像中。 谢谢拍砖 ....
  • 我们在有些时候,需要把动态ip改为静态ip,有时候又需要把静态ip改为动态ip,很麻烦,我这里写了两个bat文件,方便切换,是不是更简单了 我转换为动态ip的bat文件名为autoIP.bat,代码如下: @echo off netsh ...
  • 加载速度不一样四、如何生成动静态文件静态库的生成库文件的搜索路径动态库的生成总结参考 一、什么是头文件?什么是库文件?有什么区别? 先说总结 头文件是包含函数声明,宏定义,类的声明的文件。 在
  • 浪费空间资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。 二、动态库 在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用...
  • 一、静态和动态库的意义1. 动态函数库 动态库的名字一般是libXXX.so;动态函数库在编译的时候并没有被编译进目标代码中,当程序执行到需要调用的时候才调用该函数库(动态库)里的相应函数,因此动态函数库所产生...
  • 最近要用到的签名算法只给了一堆源码没有给库文件,api都不好调用,于是尝试着用Makefile给一堆c源码编译静态链接库文件和动态链接库文件。Makefile文件编辑的相关资料链接:...
  • 代码中动态和布局文件静态改变Edittext光标样式方法
  • 静态文件和动态库文件都必须基于.o文件来生成。 1.静态库文件(libxxx.a): 前缀必须为lib,后缀必须为.a。 (1)生成: ar -r libmyfunction.a function.o 将对function.o生成静态库文件,文件名必须为...
  • Makefile文件以及静态和动态

    千次阅读 2019-08-17 22:01:02
    在Linux下写项目总会碰见这样的情况------哎呀~~这个项目的文件需要好多文件一起编译,这么多,眼睛快花了。我去!少编译一个,又要重新打了,心态炸了。。。。 //(T o T)// makefile文件目的是为了方便工程管理,...
  • 动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyh ello.so。用gcc来创建动态库。 在...
  • 动态和静态库 文件描述符 上面两个接口分别是c语言的fread接口和linux的read接口,当我们在使用的时,可能会有疑问,为什么linux的io接口能只通过一个整型的fd来操控文件和io?这个fd又是什么? 文件描述符fd ...
  • WindowsLinux下的目标文件静态和动态库 一、dll .obj .lib使用在windows平台下: .dll:动态链接库,作为共享函数库的可执行文件。 .obj:目标文件,相当于源代码对应的二进制文件,未经重定位。 .lib:可...
  • jsp 动态包含和静态包含    <jsp:include page=""></jsp:include> 动态包含:    <% @ include file="" %> 静态包含是指:在jsp编译期间把...
  • 静态加载: 创建qrc文件,在.pro文件中加RESOURCES...动态加载,创建qrc文件,使用rcc工具rcc -binary '/resource.qrc' -o /resource.rcc 编译出rcc文件,代码中添加QResource::registerResource("resource.rcc");即可
  • 在我们写代码的的时候经常会用到很多头文件,其实并不是用那些头文件,而是告诉系统,我写的写个代码需要几个函数,而这几个函数存在一个文件里,我已经把文件名也就是头文件告诉系统了,系统会自动的去一个目录下...
  • 一、静态库和动态库 1、静态库(.lib)  函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制...2、动态库(.lib文件和.dll文件)  在使用动
  • 三、使用Makefile制作动态库、静态库 3.1 Linux下的库(动态库、静态库)简介 3.1.1 什么是库 3.1.2库的种类 3.2.3 库存在的意义 3.2.4在linux下如何制作库文件 3.2.5 查看可执行程序依赖的库(ldd命令) ...
  • 静态库用ar -t YourFile 动态库用 nm -D YourFile ldd 查看可执行文件链接了哪些 系统动态链接库 nm 查看可执行文件里面有哪些符号 strip 去除符号表可以给可执行文件瘦身 strings 从可执行程序里面提取...
  • 动态和静态

    2015-06-12 16:40:47
    ## 动态和静态库小结 ## 动态和静态库是编程过程中经常用到的两个东西,不同的背景下使用不同的方式,为了达到更好的目的。用途 动态和静态库都是用来封装相同类型作用的函数,以便用来自己或第三方使用的...
  • 近期正在做在Ubuntu环境下将C++程序封装成动态文件和静态库文件,期间不知道掉了多少坑,在这里写下来以免忘记工作是将实现MTCNN的C++源代码封装成动态文件和静态库文件,原先在github上找到了一个依据opencv和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,716
精华内容 7,486
关键字:

动态文件和静态文件