动态库

Linux 动态库相关知识整理

会有一股神秘感。 提交于 2019-12-06 06:39:50
动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序,动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执行程序等诸多好处。作者是一个Linux后台开发,这些知识经常用到,所以整理了一下这方面的知识。静态库相对简单,本文只关心Linux平台下的动态库。 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //elfhash.h #include unsigned long ELFhash( const char * key); //elfhash.c #include "elfhash.h" unsigned long ELFhash( const char * key) { unsigned long h = 0, g; while ( *key ) { h = ( h > 24; h &= ~g; } return h; } 接下来使用gcc编译以上代码,并用ld将编译的目标文件链接成动态库 1 2 gcc -fPIC -c -Wall elfhash.c ld -shared elfhash.o -o libelfhash.so 其中 -fPIC 意思是生成位置无关的代码(Position

cpp调用c的动态库

六眼飞鱼酱① 提交于 2019-12-05 17:57:05
目录 cpp调用c的动态库 title: cpp调用c的动态库 date: 2019/11/22 20:34:29 toc: true --- cpp调用c的动态库 CPP文件里这么引用头文件即可 extern "C" { #include "apue.h" } 来源: https://www.cnblogs.com/zongzi10010/p/11938685.html

C++静态库与动态库的区别

馋奶兔 提交于 2019-12-05 17:18:32
在日常开发中,其实大部分时间我们都会和第三方库或系统库打交道。在 Android 开发音视频开发领域,一般会用到 FFmepg、OpenCV、OpenGL 等等开源库, 我们一般都会编译成动态库共我们程序使用。对于类 unix 系统,静态库为 .a, 动态库为 .so。而 windows 系统静态库为 .lib, 动态库为.dll。 静态链接库 回顾程序编译的四个步骤: 预编译 -> 编译 -> 汇编 -> 链接 静态库和动态库就是在链接阶段行为不同,静态库会在链接阶段将汇编生成的目标文件 .o 与引用的库一起链接打包到可执行文件中。静态库其实就是一系列目标文件的集合,可以用 ar 工具打包生成。静态库特点有: 静态库对函数的链接在编译时期完成 程序在运行时与函数库再无关系 浪费资源空间,因为所有相关的目标文件都会被链接到一个可执行文件中 我们来看一个例子: // 头文件 Math.hpp #ifndef Math_hpp #define Math_hpp #include <stdio.h> extern int add(int a, int b); #endif /* Math_hpp */ // Math.hpp 实现文件 #include "Math.hpp" int add(int a, int b) { return a + b; } // main.cpp main

记一次把Windows程序移植到Linux的过程

谁说胖子不能爱 提交于 2019-12-05 16:51:21
场景复现 今天下午,客户反映我们系统的API在Linux下使用时有点问题。发布主管,想在本地做个测试,但是目前现有的Demo程序只有windows版本的,所以找到负责API的我,把该Demo程序从Windows移植到Linux。 问题及解决方案 问题1: windows下的vsnprintf_s在Linux下该替换为什么呢? 解决方法: Linux下可以采用vsnprintf函数来对vsnprintf_s进行替换。 注意点: vsnprintf与vsnprintf_s的参数对应基本相同,只不过需要给出所要写入的buffer的大小。具体请参见 vsnprintf和 vsnprintf_s的函数定义。 问题2: windows下的Sleep函数在Linux下替换为什么? 解决方法: Linux下对应的睡眠函数为sleep和usleep,不同点在于,sleep函数对应的睡眠时间参数是以秒为单位的,usleep函数对应的睡眠时间参数是以微秒为单位的。而windows下的Sleep函数的参数是以毫秒为单位的。 问题3: 编译时遇到如图所示问题: 解决方案: 本次编译出现上面问题的原因是所用的Linux操作系统是64位的,而所链接的动态库所支持的是32位操作系统,进而把动态库替换为64位的即可解决问题。 问题4: 编译链接得到可执行文件之后,执行可执行文件出现如图所示错误提示: 解决方法:

vs查看动态库依赖

瘦欲@ 提交于 2019-12-05 15:33:08
dumpbin是VS自带的工具,进入Visual Studio 的命令提示 查看程序或动态库所依赖的动态库 dumpbin /dependents abc.exe 查看动态库的输出函数 dumpbin /exports abc.dll 参考博客: https://blog.csdn.net/heli200482128/article/details/51718417/ 来源: https://www.cnblogs.com/juluwangshier/p/11931442.html

Linux下显示运行时链接(运行时加载)

六月ゝ 毕业季﹏ 提交于 2019-12-05 14:56:10
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dlerror() dlclose() show code 内容学习自《 程序员的自我修养 链接装载与库》 如果只是想知道如何使用如何加载动态库和那4个函数的使用,可以直接从如何加载动态库开始看。 介绍 支持动态链接的系统往往都支持一种更加灵活的模块加载方式,叫做显式运行时链接(Explicit Run-time Linking),有时候也叫做运行时加载。也就是让程序自己在运行时控制加载指定的模块,并且可以在不需要该模块时将其卸载。从前面我们了解到的来看,如果动态链接器可以在运行时将共享模块装载进内存并且可以进行重定位等操作,那么这种运行时加载在理论上也是很容易实现的。而且一般的共享对象不需要进行任何修改就可以进行运行时装载,这种共享对象往往被叫做动态装载库(Dynamic Loading Library),其实本质上它跟一般的共享对象没什么区别,只是程序开发者使用它的角度不同。 这种运行时加载使得程序的模块组织变得很灵活,可以用来实现一些诸如插件、驱动等功能。当程序需要用到某个插件或者驱动的时候,才将相应的模块装载进来,而不需要从一开始就将他们全部装载进来,从而减少了程序启动时间和内存使用

在Window和Linux下使用Zthread库

馋奶兔 提交于 2019-12-05 10:26:39
ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序。 ZThread库的主页: http://zthread.sourceforge.net 最新版本Zthread远吗下载地址: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz ZThread文档: http://zthread.sourceforge.net/documentation.html 一、 在Windows 下使用ZThread 首先,下载ZThread,解压到某个目录下,我解压到D:\libs\ZThread-2.3.2\中。 方法1 :包含源文件直接编译( 不推荐) 1.在vs2010中,新建一个新的win32 控制台项目,选择空项目。 2.在源目录下新建一个main.cpp文件,在 http://zthread.sourceforge.net/html/classZThread_1_1Thread.html 中复制一段示例代码拷贝到main.cpp中。 3.在项目的配置属性中,VC++目录的包含目录中增加ZThread的头文件目录,我这里是:D:\libs\ZThread-2.3.2\include。配置属性分DEBUG和RELEASE两个

iOS 企业重签名 无需替换包名

余生颓废 提交于 2019-12-05 06:11:28
1、首先准备好待签名的ipa (此ipa 为非299$的开发账号签名后的ipa),企业版发布证书,embedded.mobileprovision配置文件,entitlements.plist 文件。证书配置与创建配置文件这里不做赘述。 entitlements.plist 文件格式为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>application-identifier</key> <string>AAAAAA.com.test.test</string> <key>com.apple.developer.team-identifier</key> <string>AAAAAA</string> <key>get-task-allow</key> <false/> <key>keychain-access-groups</key> <array> <string>AAAAAA.com.test.test</string> </array> </dict> </plist>

Windows平台LoadLibrary加载动态库搜索路径的问题

天大地大妈咪最大 提交于 2019-12-05 04:56:11
一、背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方。这样一方面可以与其他程序共享这些动态库,还能保证插件安装时非常的清爽。就 Adobe Premiere Pro/After Effects 来说,插件文件是放到 C:\Program Files\Adobe\Common\Plug-ins\7.0\MediaCore ( Windows 平台)的。这个是 PremierePro 和 AfterEffects 的公共插件目录,二者在启动的时候都会尝试去这个位置加载插件。与此同时,我们希望自己开发的插件所依赖的动态库放到另外的位置,另外也希望插件显示链接的动态库能够尽量少。因为如果是显式链接的话,这些插件依赖的动态库必须和插件保存在同一个位置。不然插件找不到这些依赖文件就会加载失败的。当然,我们也可以在环境变量里面增加一条路径,但是这容易污染环境变量,或者与其他的程序库产生冲突。 LoadLibrary 在这个时候就产生作用了。 LoadLibrary 通过将指定路径的动态库加载到当前的调用进程,然后获取其导出的函数就可以正常使用了。对于像第三方插件这样的应用场景, LoadLibrary 可以说是个不错的实现方式。但是正因此也有个弊端

ios 开发中 动态库 与静态库的区别

◇◆丶佛笑我妖孽 提交于 2019-12-05 02:41:02
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。 深入理解framework(框架,其实相当于静态框架,不是动态库) 打包framework还是一个比较重要的功能,可以用来做一下事情: (1)封装功能模块,比如有比较成熟的功能模块封装成一个包,然后以后自己或其他同事用起来比较方便。 (2)封装项目,有时候会遇到这个情况,就是一家公司找了两个开发公司做两个项目,然后要求他们的项目中的一个嵌套进另一个项目,此时也可以把呗嵌套的项目打包成framework放进去,这样比较方便。 来源: https://www.cnblogs.com/ZsjXxy/p/11898853.html