目录

静态库说明

动态库说明

动态库隐式调用

动态库显式调用

在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>,提供了下面几个接口:

  1. void * dlopen( const char * pathname, int mode ):函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。
  2. void* dlsym(void* handle,const char* symbol):dlsym根据动态链接库操作句柄(pHandle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
  3. int dlclose (void *handle):dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
  4. const char *dlerror(void):当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

在Windows下显式调用动态库

应用程序必须进行函数调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须:

  1. 调用 LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
  2. 调用 GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用 DLL 的函数,编译器不生成外部引用,故无需与导入库链接。
  3. 使用完 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编译静态库与动态库相关推荐

  1. QT 静态库和动态库的使用方法

    QT 静态库和动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1 ...

  2. C++基于QT创建并使用静态库和动态库

    如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...

  3. Qt 静态库和动态库

    Qt 静态库和动态库 创建和使用静态库 创建静态库 使用静态库的文件 创建和使用动态库 创建动态库 使用动态库 隐式链接调用共享库 显示调用 创建和使用静态库 创建静态库 1.选择新建文件和项目.=& ...

  4. PHP编译为静态库,makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  5. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

  6. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  7. Linux基础——gcc编译、静态库与动态库(共享库)

    Linux基础--gcc编译.静态库与动态库(共享库) https://blog.csdn.net/daidaihema/article/details/80902012 Linux基础--gcc编译 ...

  8. linux centos 编译luabind-0.9.1 动态库 静态库

    luabind下载 luabind-0.9.1 下载地址 :http://download.csdn.net/download/yzf279533105/10109861 编译步骤 一. 需先编译好l ...

  9. 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 / ...

  10. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...

最新文章

  1. 「查缺补漏」巩固你的 RocketMQ 知识体系
  2. JSValidation 配置文件
  3. URL概念及与URL的区别
  4. 实用 —— PowerCLI (一)
  5. 我的 2021 年终总结
  6. 数据仓库与联机分析处理笔记
  7. Cloud Fiori Launchpad
  8. JSF和“立即”属性–命令组件
  9. 【八】有验证码登录配置:通过 Cookie 跳过验证码登录接口
  10. 【C】malloc动态分配内存和free释放
  11. 西安工程大学计算机是几本专业,西安工程大学专业介绍
  12. 苹果手机透明桌面_微信界面全局透明壁纸设置教程 苹果iOS与安卓手机弄法步骤...
  13. 使用JavaScript删除HTML元素
  14. Centos7磁盘阵列部署与修复
  15. 共享姨妈巾出来了成为共享家族中的热门产品
  16. Adobe国际认证设计师证书含金量怎么样?
  17. js获取当天0时刻,23点59分59秒的时间戳
  18. 基于PHP+MySQL的大学生求职招聘网站
  19. 爬虫系列 | 1、什么是爬虫,玩爬虫的正确姿势有哪些
  20. ​FH5202原厂2A开关式同步降压型锂电池充电电路IC

热门文章

  1. (转)Python之区块链入门
  2. (转)芒格:投资成功不是频繁交易,而是好的决策和耐心
  3. (转)李嘉诚:成功源于花90%时间考虑失败
  4. 阿里云高级技术专家彦林:云原生架构下的微服务演进
  5. 【优化算法】麻雀搜索优化算法(SSA)【含Matlab源码 1288期】
  6. 【TWVRP】基于matalb蚁群算法求解带时间窗的车辆路径规划问题【含Matlab源码 775期】
  7. 【图像检测】基于matlab GUI比值+归一化+相关系数遥感图像【含Matlab源码 737期】
  8. 【图像评价】基于matlab无参考图像质量评价NIQE【含Matlab源码 681期】
  9. python 网络设备巡检_python写的一个服务器自动巡检工具
  10. 深度学习行人检测简介_深度学习简介