让静态链接库(static library)兼容 MT, MTd, MD, MDd 4种运行库

时间:2021-11-18 19:29:59

最近在使用一个动态库产品时发现对方只提供了一个lib文件和.h文件, 但是神奇的是这个lib在 MT, MTd, MD, MDd 4种运行库 中均可以正确的编译, 所以进行了一番研究.


要想实现兼容, 必须满足如下条件


1. 生成lib文件的源码中不能使用 Standard C++ Library

   在源代码中不能包含<string>, <vector> 等类似这样的C++标准定义的头文件, 否则会出现类似下边的错误


1>StaticLib.lib(StaticLib.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项:  值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”(LibDemo.obj 中)


2. 设置编译器参数: Zl


C/C++ -> 高级 -> 省略默认的库名称: 是(/Zl)


注: 因为不是很了解编译器的运行机制, 所以暂时还不确定这样做是否会带来问题

原则上应注意边界问题, 不要与lib文件传递crt对象