Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81051
  • 博文数量: 11
  • 博客积分: 289
  • 博客等级: 二等列兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-12 14:51
个人简介

linux的爱好者,GNU的支持者。 小白中的牛人,高手中的菜鸟。 个人开源项目:https://sourceforge.net/projects/schultetable

文章分类

全部博文(11)

文章存档

2021年(2)

2017年(3)

2013年(2)

2012年(2)

2011年(2)

分类: C/C++

2017-04-22 16:56:22

本文以gcc/g++/mingw的情况为主,日后可能会整理其它的编译器等内容。

静态库

将编译后的目标文件进行打包而生成的库,不包含对依赖库的链接。链接时需要显示链接依赖库,链接后的可执行文件包含可执行文件对该库所需的内容,库的本身不需要同可执行文件一起发布。适用于独立性较弱的子工程、子模块等。

动态库/共享库

动态库包含对依赖库的链接

动态链接

链接时不需要显示链接依赖库,链接后的可执行文件不包含可执行文件对该库所需的内容,需要同可执行文件一起发布。适用于独立性较强的功能模块等。在windows上需要添加__declspec(dllimport)/__declspec(dllexport)显式地导入/导出接口类或接口函数。
在头文件中可以使用如下代码来定义API的前置的宏,在导出的地方,编译时添加IN_LIBMARCO宏,在链接的地方,编译时不添加IN_LIBMARCO宏

  1. #ifdef IN_LIBMARCO
  2. #define LIB_API __declspec(dllexport)
  3. #else
  4. #define LIB_API __declspec(dllimport)
  5. #endif

运行时加载

对于声明为extern "C"(C++中,C语言编译成的动态库不需要)的接口可以在运行时动态地进行解析与加载,这为动态加载动态库提供了可能。适用于应用程序插件性质的动态库。

动态链接与运行时加载

因为种种理由(比如提高启动速度等),有些人喜欢使用运行时加载来代替动态链接,但要注意的是,如果在加载时缺少所需要的动态库,操作系统是不会提示你缺少什么库的,如果运行时大量加载动态库,并且加载的库还依赖其它的库或文件,那么在移植的时候,很容易忽视部分运行所必需的文件或库,如果你的程序以及库没有进行精心设计的话,到时候将会是一件很头疼的事情,所以应慎用这种模式。

查看运行时所需的库

在windows上可以可以利用“资源监视器”(system monitor)来查看程序当前正在使用的dll,方法是:
打开“任务管理器”->性能页面->点击“资源监视器”按钮 在“资源监视器”程序中,切换到CPU页面->在最上面的第一栏中点选需要查看的进程,在最后一栏中便可看到当前程序正在使用的所有dll。下图便是查看firefox进程正在使用的dll:


版权声明:本文乃pl014(panuins@gmail.com)
原创文章,日后可能会进行修改建议暂时不要转载如需转载,需要注明原文地址(http://blog.chinaunix.net/uid-20659338-id-5763348.html)。


阅读(3404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~