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

相关文章

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu