问题解决: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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec