本文以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:
浅析静态库以及动态库的动态链接和运行时加载(C/C++)-LMLPHP


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


08-30 22:47