QT编译静态库与动态库
目录
静态库说明
动态库说明
动态库隐式调用
动态库显式调用
在Linux下显式调用动态库
在Windows下显式调用动态库
显式调用C++动态库注意点
静态库调用
静态库说明
在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。静态库与.o文件格式相似,可以看成是一组目标文件(.o/.obj)的集合,即很多目标文件压缩后打包形成的一个文件。静态库特点:
I 静态库对函数库的链接是放在编译期完成的。
II 程序在运行时与函数库再无瓜葛,移动方便。
III 浪费空间和资源,因为所有的目标文件相当于拷贝进了可执行文件。
动态库说明
在编译时不会被链接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的示例,规避了空间浪费问题(由此可以思考,为什么动态库又被称作共享库?)。动态库在程序运行时才会被载入,也解决了静态库对程序的更新、部署和发布带来的麻烦,只需要更新动态库即可,增量更新。动态库特点总结:
I 动态库把对库函数的链接推迟到程序运行时期。
II 可以实现进程之间的资源共享。
III 将程序的升级变得简单。
IV 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
windows与linux执行文件格式不同,在创建动态库时有一些差异:
I 在windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做初始化的入口,通常在导出函数的声明时需要有_declspec(dellexport)关键字。
II linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别声明,编写比较方便。
注意
无论是动态链接还是静态链接都会有一个.lib文件,动态库的lib文件叫【导入库】,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
动态库隐式调用
编译时导出使用_declspec(dellexport)关键字
调用时导入使用_declspec(dellimport)关键字
动态库显式调用
在Linux下显式调用动态库
#include <dlfcn.h>,提供了下面几个接口:
- void * dlopen( const char * pathname, int mode ):函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。
- void* dlsym(void* handle,const char* symbol):dlsym根据动态链接库操作句柄(pHandle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
- int dlclose (void *handle):dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
- const char *dlerror(void):当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。
在Windows下显式调用动态库
应用程序必须进行函数调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须:
- 调用 LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
- 调用 GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用 DLL 的函数,编译器不生成外部引用,故无需与导入库链接。
- 使用完 DLL 后调用 FreeLibrary。
显式调用C++动态库注意点
对C++来说,情况稍微复杂。显式加载一个C++动态库的困难一部分是因为C++的name mangling;另一部分是因为没有提供一个合适的API来装载类,在C++中,您可能要用到库中的一个类,而这需要创建该类的一个实例,这不容易做到。
name mangling可以通过extern "C"解决。C++有个特定的关键字用来声明采用C binding的函数:extern "C" 。用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。因此,只有非成员函数才能被声明为extern "C",并且不能被重载。尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。冠以extern "C"限定符后,并不意味着函数中无法使用C++代码了,相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。
静态库调用
1、静态库的编译
和动态库的区别是,pro文件中需要增加以下内容
CONFIG += staticlib
2、调用
这里我调用的是quazip库。quazip源码中有以下一段说明QUAZIP_STATIC的作用。而静态库其实相当于对源码的直接拷贝使用,所以需要额外声明 DEFINES += QUAZIP_STATIC。
INCLUDEPATH += $$PWD/3rdparty/quazip/include/
#staticlib
DEFINES += QUAZIP_STATIC
DEPENDPATH += $$PWD/3rdparty/quazip/include/CONFIG(debug, debug|release): {
LIBS += -lzlib
#staticlib
PRE_TARGETDEPS += $$PWD/3rdparty/quazip/libwin/lib/quazipd.lib
PRE_TARGETDEPS += $$PWD/3rdparty/quazip/libwin/lib/zlib.lib
} else {
LIBS += -lzlib
#staticlib
PRE_TARGETDEPS += $$PWD/3rdparty/quazip/libwin/lib/quazip.lib
PRE_TARGETDEPS += $$PWD/3rdparty/quazip/libwin/lib/zlib.lib
}
QT编译静态库与动态库相关推荐
- QT 静态库和动态库的使用方法
QT 静态库和动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1 ...
- C++基于QT创建并使用静态库和动态库
如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...
- Qt 静态库和动态库
Qt 静态库和动态库 创建和使用静态库 创建静态库 使用静态库的文件 创建和使用动态库 创建动态库 使用动态库 隐式链接调用共享库 显示调用 创建和使用静态库 创建静态库 1.选择新建文件和项目.=& ...
- PHP编译为静态库,makefile生成静态库和动态库
库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...
- NDK 编译和使用静态库、动态库
NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- Linux基础——gcc编译、静态库与动态库(共享库)
Linux基础--gcc编译.静态库与动态库(共享库) https://blog.csdn.net/daidaihema/article/details/80902012 Linux基础--gcc编译 ...
- linux centos 编译luabind-0.9.1 动态库 静态库
luabind下载 luabind-0.9.1 下载地址 :http://download.csdn.net/download/yzf279533105/10109861 编译步骤 一. 需先编译好l ...
- adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...
一.gcc编译过程 gcc -E hello.c -o hello.s //预处理 gcc -S hello.s -o hello.i //编译 gcc -c hello.i -o hello.o / ...
- g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解
下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...
最新文章
- 「查缺补漏」巩固你的 RocketMQ 知识体系
- JSValidation 配置文件
- URL概念及与URL的区别
- 实用 —— PowerCLI (一)
- 我的 2021 年终总结
- 数据仓库与联机分析处理笔记
- Cloud Fiori Launchpad
- JSF和“立即”属性–命令组件
- 【八】有验证码登录配置:通过 Cookie 跳过验证码登录接口
- 【C】malloc动态分配内存和free释放
- 西安工程大学计算机是几本专业,西安工程大学专业介绍
- 苹果手机透明桌面_微信界面全局透明壁纸设置教程 苹果iOS与安卓手机弄法步骤...
- 使用JavaScript删除HTML元素
- Centos7磁盘阵列部署与修复
- 共享姨妈巾出来了成为共享家族中的热门产品
- Adobe国际认证设计师证书含金量怎么样?
- js获取当天0时刻,23点59分59秒的时间戳
- 基于PHP+MySQL的大学生求职招聘网站
- 爬虫系列 | 1、什么是爬虫,玩爬虫的正确姿势有哪些
- ​FH5202原厂2A开关式同步降压型锂电池充电电路IC
热门文章
- (转)Python之区块链入门
- (转)芒格:投资成功不是频繁交易,而是好的决策和耐心
- (转)李嘉诚:成功源于花90%时间考虑失败
- 阿里云高级技术专家彦林:云原生架构下的微服务演进
- 【优化算法】麻雀搜索优化算法(SSA)【含Matlab源码 1288期】
- 【TWVRP】基于matalb蚁群算法求解带时间窗的车辆路径规划问题【含Matlab源码 775期】
- 【图像检测】基于matlab GUI比值+归一化+相关系数遥感图像【含Matlab源码 737期】
- 【图像评价】基于matlab无参考图像质量评价NIQE【含Matlab源码 681期】
- python 网络设备巡检_python写的一个服务器自动巡检工具
- 深度学习行人检测简介_深度学习简介