当前位置: 首页 > news >正文

使用openMVS库,在VS2022中启用c++17标准编译仍然报错

使用openMVS库,在VS2022中启用c++17标准编译仍然报错

现象

项目中引用了某些开源库(例如openmvs2.1.0),编译时要求启用编译器对c++17的支持。

没问题!大家都知道在下图所示的位置调整C++语言标准:
在这里插入图片描述
但是,打开开关之后编译,依然报错:

在这里插入图片描述
这可真是一个令人百思不得其解的错误啊。报错的文件是官方的头文件type_traits,双击之后跳转的错误位置也看不出个所以然。

在这里插入图片描述
这下头大了。不过,之前编译openmvs库时,用的是同一版本的VS编译器,怎么就成功了呢?于是查看vcpkg自动编译openmvs时用cmake配置生成的CMakeCache.txt中的编译选项,才找到了真正原因,如下图所示:

在这里插入图片描述
图中标出来的选项是cmake生成的,并不常见,至少在VS2022中没有提供开关,而只能靠用户手动输入到属性页、C/C++、命令行的其他选项框中。

报错原因:__cplusplus

__cplusplus宏是MSVC编译器预定义的宏,它的值是许多语法特性的开关。前面讲了,要启用c++17标准,就在C++语言标准设置好即可。然而,__cplusplus宏值不随上面的C++语言标准/std 选项)设置而改变,需要同时添加:/Zc:__cplusplus编译选项,才能随着语言标准而改变,如下表所示:

/Zc:__cplusplus 选项/std 选项__cplusplus 值
Zc:__cplusplus/std:c++14(默认值)201402L
Zc:__cplusplus/std:c++17201703L
Zc:__cplusplus/std:c++20202002L
Zc:__cplusplus/std:c++latest当前最新日期,目前是202002L
Zc:__cplusplus-(已禁用)任何值199711L
未指定任何值199711L

表中的/std 选项就是上一节的C++语言标准属性。
可见,如果没有添加/Zc:__cplusplus__cplusplus宏的值始终都是199711L,启用的c++17标准也是不完整的。微软这么操作的理由是:有很多老代码写得不规范(不符合语言标准),之前版本的编译器(由于对语言标准的遵守不严格)能编译通过,我们希望使用新编译器时它们的改动也尽可能小。
于是,本来支持严格的标准C++语法的编译器的默认状态仍和原来一样,__cplusplus宏的值始终是199711L;直到开发者在编译器的命令行中加入/Zc:__cplusplus,它才真正变成实际使用语言标准的值。

其实多数情况下,__cplusplus宏的值对代码编译影响不大。但是很多高水平开源库使用了新语法,恰恰需要__cplusplus宏的值符合语言标准(/std 选项)才能编译通过,这是对开源开发者很不友好的。

P.S. 官方的愿景是,有朝一日仅需要设定/std 选项__cplusplus宏的值就随之改变,不需要额外添加/Zc:__cplusplus

解决方法

属性页—C/C++—命令行—其他选项中添加:/Zc:__cplusplus。重新编译,即可。

在这里插入图片描述

扩展阅读

/Zc-cplusplus的微软官方说明
C++语言标准切换选项
官方:终于能正确设定__cplusplus值了

用/std选项确定c/c++语言标准
强制符合语法标准选项/permissive-

一点认识:MSVC的C/C++编译器默认情况下实现了当前标准和未来一些标准中的语法。当指定语言标准为默认的/std:c++14时,大部分新标准的语法将被禁用,但仍有一部分在引入/std选项之前就实现的新语法标准可用。
但指定/std:c++xx(xx>14)时,新实现的c++xx以后的语法将不可用。

http://www.lryc.cn/news/262842.html

相关文章:

  • uniGUI之上传文件UniFileUploadButton
  • 福德植保无人机工厂:创新科技与绿色农业的完美结合
  • JsRpc技术服务搭建,最简单的JSRPC,Flask+undetected-chromedriver
  • <优化接口设计的思路>:接口安全
  • Gitee基础知识
  • 网络空间搜索引擎- FOFA的使用技巧总结
  • 用户行为分析遇到的问题-ubantu16,hadoop3.1.3
  • camera曝光时间
  • Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码
  • 翻译: ChatGPT Token消耗粗略计算英文就是除以四分之三
  • 【线性代数】期末速通!
  • 速盾网络:业务卓越,数字安全的领先者
  • Python 全栈体系【四阶】(七)
  • 智能优化算法应用:基于蛾群算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • Tekton 克隆 git 仓库
  • 高通平台开发系列讲解(AI篇)SNPE工作流程介绍
  • YoloV8改进策略:ASF-YOLO,结合了空间和尺度特征在小目标和密集目标场景有效涨点
  • OpenCV-8RGB和BGR颜色空间
  • 阿里云主导《Serverless 计算安全指南》国际标准正式立项!
  • YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
  • AWS RDS慢日志文件另存到ES并且每天发送邮件统计慢日志
  • 如何在断线后不重连加入音视频房间
  • RabbitMq交换机详解
  • 智能优化算法应用:基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • spring之基于注解管理Bean
  • Wireshark在云计算中的应用
  • 三菱plc学习入门(一,认识三菱plc)
  • 设计模式——中介者模式
  • 【 USRP安装教程】MATLAB 2023B
  • AI绘画中UNet用于预测噪声