动态库

动态库与静态库的区别

十年热恋 提交于 2020-03-21 05:46:00
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当 然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。 2. 动态函数库 这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的 程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。 linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。 静态库的使用 静态库的操作工具:gcc和ar 命令。 编写及使用静态库 (1)设计库源码 pr1.c 和 pr2.c [root@billstone make_lib]# cat pr1.c void print1() { printf("This is the first lib src!\n")

ldd命令,查看依赖的动态库信息 nm命令可以列出一个函数库文件中的符号表

萝らか妹 提交于 2020-03-18 13:26:12
某厂面试归来,发现自己落伍了!>>> ldd命令的作用是查看程序依赖的动态链接库信息。使用nm命令也可以获取库函数的信息;nm命令可以列出一个函数库文件中的符号表,它对静态的库函数和共享的库函数都能起作用。 Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径 。 可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。 方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径 。 通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。下面通过例2来说明本方法。 方法三:在编译目标代码时指定该程序的动态库搜索路径 。

静态库与动态库的区别?

筅森魡賤 提交于 2020-03-17 16:47:43
一、什么是库? 库是共享程序代码的方式,一般分为静态库和动态库。 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。 三、iOS里静态库形式? .a和.framework 四、iOS里动态库形式? .dylib和.framework 五、framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.framework是静态库。 六、a与.framework有什么区别? .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。 .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。 .a + .h + sourceFile = .framework。 建议用.framework. 七、为什么要使用静态库? 方便共享代码,便于合理使用。 实现iOS程序的模块化。可以把固定的业务模块化成静态库。 和别人分享你的代码库,但不想让别人看到你代码的实现。 开发第三方sdk的需要。 八、制作静态库时的几点注意: 1 注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上

vs2012工程调用ffmpeg4.2.2静态库

妖精的绣舞 提交于 2020-03-17 10:53:23
下载最新ffmpeg动态库 到ffmpeg官网下载最新的windows版ff动态库 Shared包含ff的动态库dll文件,Dev包含ff的头文件和静态库.lib文件 创建工程调用ff静态库 1.该工程是64位的 因为如上截图,所下载的库都是基于win-64的,所以vs工程也是64位 #创建include和lib目录把对应的文件放进去 设置工程的头文件,库文件路径 就像平常的vs工程设置静态库的头文件和库目录步骤设置就好 把动态库都放在调试的根目录下 调用ff库接口 调用成功 来源: CSDN 作者: zyl-2019 链接: https://blog.csdn.net/Binair2019/article/details/104879030

cmake编译动态库和静态库

狂风中的少年 提交于 2020-03-17 07:14:20
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(hello) #添加源文件 aux_source_directory(./ DIR_SRCS) #设置编译参数 set(CMAKE_C_FLAGS "-g -Wall") #添加头文件路径 include_directories( ./include ) #添加库 find_library(RT rt /usr/lib64) find_library(DL dl /usr/lib64) find_library(MATH m /usr/lib64) #link库 link_libraries(${DL} ${RT} ${MATH}) #定义 add_definitions(-g3 -MD -Wall -DOS_LINUX=1 -pthread -lconfig -DPLAT_MODULE_DEVSM) #生成动态库和静态库 add_library(acc_lib_shared SHARED ${DIR_SRCS}) add_library(acc_lib_static STATIC ${DIR_SRCS}) #将动态库和静态库的名字设置 set_target_properties(acc_lib_shared PROPERTIES OUTPUT_NAME "hello") set_target

动态链接库dll的 静态加载 与 动态加载

[亡魂溺海] 提交于 2020-03-17 03:52:44
动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找 。 而静态链接就是把所有用到的函数全部链接到exe文件中。 动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入; 而静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。 静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候, 载入代码就会把程序会用到的动态代码或动态代码的地址确定下来 静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库 动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary() ,使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的 逻辑地址 ,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。 1. 生成 静态链接库 newdll) win32项目 -> dll 添加.h文件 betabinlib.h #ifndef BETABINLIB_H #define BETABINLIB_H

车牌识别一体机二次开发

烂漫一生 提交于 2020-03-16 17:26:38
文通车牌识别一体机挂接分为两种挂接方式:动态库方式挂接和协议方式挂接。 1、动态库方式挂接:动态库方式挂接支持6种开发语言(VC++、Delphi、C#、VB.NET、Linux、Java)。 动态库方式支持的主要功能和特点: ①获取识别结果(车牌号码、车牌颜色、车辆图像、车牌可信度、车辆行驶方向) ②获取网络连接时时状态。(断开、正常连接) ③断网自动重连 ④模拟地感触发 ⑤设置识别结果传输的内容(车牌号码、全景图、车牌小图) ⑥控制道闸抬杆 ⑦RS485的透明传输 2、协议方式挂接:分为TCP协议、HTTP协议 (1)TCP协议 ①识别结果的传输(车牌号码、车牌颜色、车辆图像、车牌可信度、车辆行驶方向) ②模拟地感触发 ③控制道闸抬杆 (2)HTTP协议 ①识别结果的传输(车牌号码、车牌颜色、车辆图像、车牌可信度、车辆行驶方向) ②预设的停车场ID ③预设的口的方向(出口、入口) 协议挂接方式的好处: ①可以跨平台编程,在不同平台(Linux、android、windows)连接相机 ②可以二进制、JSON格式的方式,获取识别信息 ③可以自由设置传输的内容(识别信息、全景图、车牌图像) 来源: 51CTO 作者: 王钰楠 链接: https://blog.51cto.com/14696426/2478911

Nim各种pragma使用方法

六月ゝ 毕业季﹏ 提交于 2020-03-14 01:58:25
Pragmas(编译指示) 编译指示"{."为开始, ".}"为结束, ","号为分隔符, 例如{.cdecl, importc.} deprecated pragma (弃用(分解?)指示) deprecated指示用来标记为弃用. proc p() {.deprecated.} var x {.deprecated.}: char 也可以在声明时使用, 需要定义一个重命名列表. type File = object Stream = ref object {.deprecated: [TFile: File, PStream: Stream].} noSideEffect pragma (无副作用指示) noSideEffect指示用于标记proc(函数)/iterator(迭代器)为无副作用, 好象是在该函数里使用影响效率的函数或者修改某些变量内容就会出错, 如echo 未来的发展方向: func可能成为无副作用函数的关键字或语法糖(就是说以后更新正式版可能会加入func这个关键字来声明无副作用函数.) func `+` (x, y: int): int procvar pragma(过程变量指示) procvar指示用于标记函数, 让它可以被传递给一个过程(函数)变量. compileTime pragma(编译时指示)

[C] linux静态链接库与动态链接库详解

寵の児 提交于 2020-03-12 20:44:48
http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为"libxxx.a"的形式. 其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime).这就是如雷贯耳的动态链接库(dynamic link library)技术. 二动态链接库的特点与优势 首先让我们来看一下,把库函数推迟到程序运行时期载入的好处: 1.可以实现进程之间的资源共享。 什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝 了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就 是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段. 2.将一些程序升级变得简单

动态库与静态库

只谈情不闲聊 提交于 2020-03-12 11:51:12
动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。 优点: 1、扩展了应用程序的特性; 2、可以用许多种编程语言来编写; 3、简化了软件项目的管理; 4、有助于节省内存; 5、有助于资源共享; 6、有助于应用程序的本地化; 7、有助于解决平台差异; 8、可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。 程序编译一般需经预处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。 静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复