问题解决:error LNK2038: 检测到“_MSC_VER”的不匹配项(一看就明白)

2024-03-28 05:08

本文主要是介绍问题解决:error LNK2038: 检测到“_MSC_VER”的不匹配项(一看就明白),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

最近在编译运行有关 cef 的项目的时候,发现总会出现这样的编译问题:

libcef_dll_wrapper13d.lib(process_message_ctocpp.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900”(HTMLEventHandler.obj 中)

这里,我要编译的项目的原来的编译平台是 Visual Studio 2013(即宏 _MSC_VER = 1800),而我正在使用的 IDE 是 Visual Studio 2017(即宏 _MSC_VER = 1900),出错信息很明确的指出了,当前的编译平台工具集并不匹配。

为什么这里不能兼容呢? Visual Studio 难道没有做到向下兼容吗?

于是我又尝试了下 Visual Studio 2010,结果也不能通过编译。

这下这就是一个有趣的问题了。

二、认识 _MSC_VER

想要探讨这个问题,首先要明白宏 _MSC_VER 的意义是什么:

_MSC_VER 是微软公司推出的 C/C++ 编译器在 ANSI/ISO C99 标准之外i扩展的宏定义,用来定义当前微软公司自己的编译器的主版本。需要注意的是,这并不是 Visual Studio 的版本号,也不是 Visual C++ 的版本号。

至于每个 Visual Studio 对应了值为多少的 _MSC_VER,可以查看这个网址:

_MSC_VER

现在,我们了解到了,宏 _MSC_VER 表明了当前项目的编译器的主版本。

那么为什么不能兼容呢?

三、StackOverflow

这个问题最终在 StackOverflow 上找到了解释:

You are trying to link objects compiled by different versions of the compiler. That’s not supported in modern versions of VS, at least not if you are using the C++ standard library. Different versions of the standard library are binary incompatible and so you need all the inputs to the linker to be compiled with the same version. Make sure you re-compile all the objects that are to be linked.

The compiler error names the objects involved so the information the question already has the answer you are looking for. Specifically it seems that the static library that you are linking needs to be re-compiled.

这位大神已经说的很清楚了,我尽量翻译下:

你在尝试着将编译自不同版本编译器的对象链接起来。在现代版本的 VS 中这是不被支持的,至少在你使用了 C++ 标准库之后就不支持了。不同版本的标准库之间是二进制不兼容的,因此你需要使用统一版本的编译器来编译其所有的输入文件。请你需要链接的对象都全部重新编译了。

编译错误提示此对象陷入了上述的问题。如果想要解决这个问题你需要重新编译所需要的静态链接库。

也就是说,在编译过程中,我将经由 Visual Studio 2013 的编译器编译出来的静态链接库文件 libcef_dll_wrapper13d.lib 放到了当前的 Visual Studio 2017 的编译器中与当前项目一起编译,故然出错。

四、解决方案

经过上述的探讨,总结解决方案有如下两个:

  1. 找指示编译器对应的编译平台进行编译:比如这里 _MSC_VER 为 1800,对应了 Visual Studio 2013,这是将当前项目与静态链接库的编译器版本进行统一的方法

  2. 使用你当前使用的 VS 对应的编译器重新编译出错的静态链接库:比如这里我只需要重新编译 libcef_dll_wrapper13d.lib(使用 VS2017 的编译器)即可

问题终于解决,网上大部分的博客都是告诉我们怎么做,而不告诉我们为什么,这是对我们对于程序的理解是不好的。

这篇关于问题解决:error LNK2038: 检测到“_MSC_VER”的不匹配项(一看就明白)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854526

相关文章

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui