Windows vs环境配置静态库和动态库的方法(/MD、/MT)

来源:互联网 发布:网络光纤收发器 编辑:程序博客网 时间:2024/06/06 15:42

对于VS环境,有很多小伙伴都迷惑于工程的配置。

在开发过程中,不知道如何去生成一个静态库或动态库,如何去使用静态库和动态库。

本文在讲述配置静态库和动态库的同时,会在工程中体现如何使用静态库和动态库。

需要下载工程的小伙伴请读到最后,有惊喜等着你。


先说说动态库和静态库

1.动态库和静态库的区别

静态库
#. 将库文件中的二进制代码直接链接到目标文件,程序运行时不再需要库
#. lib 中的指令都全部被直接包含在最终生成的目标文件中了
#. 静态链接库中不能再包含其他的动态链接库或者静态库

动态库
#. 将接口在库文件中的位置信息链接到目标文件,程序运行时再根据这些位置信息进行调用,因此运行时需要库文件
#. dll不必被包含在最终目标文件中,目标文件执行时可以“动态”地引用和卸载dll文件
#. 动态链接库中还可以再包含其他的动态或静态链接库

2.动态库和静态库的优缺点
静态库
#. 只需要编译的时候需要,运行的时候不需要,比较方便发布
#. 对于每个使用它的进程拷贝一份副本,如果进程很多,则对运行空间的要求比较高
#. 不方便程序增量更新,如果lib更新了,则所有用到lib的目标文件都需要更新
动态库
#. 运行时需要将目标文件与库文件同时发布
#. 所有进程共享一份,但这样会有DLL Hell的风险
#. 只需要更新dll库本身

下面直接奔主题,配置搞起

3.在vs环境下制作静态库和动态库

RefLibrary测试工程
#. 工程头文件定义RefLibraryDefine.h

#ifndef __REFLIBRARYDEFINE_H__#define __REFLIBRARYDEFINE_H__#ifndef REFLIBRARY_STATIC#ifdef REFLIBRARY_EXPORTS#define REFLIBRARY_API __declspec(dllexport)#else#define REFLIBRARY_API __declspec(dllimport)#endif#else#define REFLIBRARY_API#endif#endif // __REFLIBRARYDEFINE_H__

#. 导出头文件定义CalcFunc.h

#ifndef __CALCFUNC_H#define __CALCFUNC_H#include "RefLibraryDefine.h"#ifdef __cplusplusextern "C" {#endifREFLIBRARY_API int __cdecl Calc_Add(int x, int y);#ifdef __cplusplus};#endif#endif

4.配置方法(本文所讲的都是Debug下的配置)

#. 动态库调试版,依赖支持库目标文件名:RefLibraryD配置管理器:debug 运行库:MDd配置类型:动态库(.dll)生成文件:RefLibraryD.dll RefLibraryD.lib#. 静态库调试版,依赖支持库目标文件名:RefLibrarySD配置管理器:debug_S运行库:MTd配置类型:动态库(.dll)生成文件:RefLibrarySD.dll RefLibrarySD.lib#. 动态库调试版,依赖系统支持库目标文件名:RefLibrary_MTD配置管理器:debug_MT运行库:MDd配置类型:静态库(.lib)生成文件:RefLibrary_MTD.lib预处理器定义:REFLIBRARY_STATIC说明:当主程序使用这个库时,会把该库链接到目标EXE文件中,但还需要系统的运行库支持#. 静态库调试版,不依赖支持库目标文件名:RefLibrary_SMTD配置管理器:debug_SMT运行库:MTd配置类型:静态库(.lib)生成文件:RefLibrary_SMTD.lib预处理器定义:REFLIBRARY_STATIC说明:当主程序使用这个库时,会把系统的运行库链接到目标EXE文件中

总结:根据项目的需要,生成不同的目标文件,在升级程序中或在防止被杀软报毒时都可以用到,大家可以根据实际情况选择生成目标文件。


项目源码:https://github.com/seacn10/RefLibrary



原创粉丝点击