使用STL的C++静态库在Visual Studio版本间的二进制兼容性问询
VS2015/2017/2019 静态库二进制兼容性问题解答
基础兼容规则
- 微软官方宣称的跨版本二进制兼容,覆盖静态库(.lib)、动态库(.dll)、可执行文件全类型,前提是所有编译产物都采用动态链接CRT的编译选项(发布版用
/MD、调试版用/MDd)。如果采用静态链接CRT(/MT//MTd),该兼容规则不生效,不能跨版本混用。
官方说明原文:由上述任意版本编译器编译的运行时库和应用程序均为二进制兼容。
你的场景特殊注意事项
你的库公开接口直接使用STL容器作为参数、返回值,类定义如下:
class MyClass { public: MyClass(std::string person, std::vector<float> anArray); static std::vector<void*> getData(); };
这种场景下要实现VS2015编译的.lib在VS2017中正常调用,需要满足2个额外条件:
- 库的编译配置和调用方项目配置完全匹配:调试/发布配置不能混用、迭代器调试级别(
_ITERATOR_DEBUG_LEVEL宏)必须一致、结构体对齐选项必须一致。 - 交付给用户的头文件,和你编译库时使用的头文件完全一致,编译过程中没有自定义宏修改STL的默认内存布局、接口定义。
结论
只要满足上述所有前提条件,你用VS2015编译生成的mylibrary.lib,可以直接在VS2017开发环境中正常链接使用。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

