CMake设置MSVC工程MT/MTd/MD/MDd

2023-11-06


0. 前言

MSVC工程上右键->属性,找到配置属性->C/C++->代码生成->运行库,会发现有好几种选项:MT MTd MD MDd
在这里插入图片描述
这是对于多线程程序生成对象链接内容的控制。

先理解一下这四个有什么不同:

  1. 首先后面带d表示Debug,生成对象(exe、lib都行)是带有调试信息的,生成对象占用空间相比不带d的会更大一些;
  2. MTMD区别:前者是静态链接,将有关依赖库都打包进生成对象了,所以占用空间更大;后者是动态链接,运行时依赖电脑环境,容易出现换个电脑报错dll的现象。

这个出问题常见于依赖某个lib文件时,弹出LNK2038错误:
在这里插入图片描述
一般因为VS工程默认是MD/MDd,即动态链接方式,而一些库在生成时采用的是MT/MTd方式(如GoogleTest),整个项目混合使用二者产生的报错。


1. 如何设置

1.1 CMakeLists代码

先直接上代码,随后讲解要点:

# 设置策略CMP0091为NEW,新策略
if (POLICY CMP0091)
  cmake_policy(SET CMP0091 NEW)
endif (POLICY CMP0091)

# 声明一个工程
project(TestpyTest)

# 添加一个exe
add_executable(test test.cpp)

# 设置MT/MTd
set_property(TARGET test PROPERTY
  MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
	

1.2 要点1:POLICY

首先是设置POLICY CMP0091,通过cmake_policy(SET policy NEW)进行设置;

策略大概可以理解为:cmake通过选择策略的NEWOLD,可以使用不同的语法,来实现同样的功能。详情可看cmake_policy

CMP0091策略是用来控制MSVC运行库标志位flags如何设置的。就拿现在要设置的MT/MD而言,cmake 3.14及以前的版本是通过CMAKE_<LANG>_FLAGS_<CONFIG>变量进行设置的,所以网上会有很多博客说设置MT的办法大概是:

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

cmake官方说了,这种字符串的形式不太方便,所以有了新方式,详情可看CMP0091

关于POLICY设置还有一点需要注意:要在project()之前设置,另外,子项目想要使用,也需要在父项目中设置,否则cmake之后用VS打开工程,依然会LNK2038

笔者在使用GoogleTest时(GoogleTest库是MTd),把Test项目作为子项目,仅在父项目或子项目中添加POLICY不行,需要都添加CMP0091

1.3 要点2:set_property

首先记住MSVC_RUNTIME_LIBRARY属性,它的取值可以是:

  • MultiThreaded :对应MT
  • MultiThreadedDLL :对应MD
  • MultiThreadedDebug:对应MTd
  • MultiThreadedDebugDLL:对应MDd

这几个取值通过字符串形式设置给MSVC_RUNTIME_LIBRARY属性,但官方给的字符串是:

"MultiThreaded$<$<CONFIG:Debug>:Debug>"

这用到了cmake的生成表达式(generator expression)功能,使得当ConfigDebug时,自动添加Debug。使用到了嵌套表达式:

  1. $<CONFIG:Debug>使用了变量查询的语句,当处于Debug模式时,该表达式为1
    在这里插入图片描述
  2. 知道上一条之后,<$<$<CONFIG:Debug>: Debug>就变成了$<1或0:Debug>,使用的是条件表达式,当前部分为1是该表达式为Debug,否则为空:
    在这里插入图片描述

生成表达式可以参考官方:cmake-generator-expressions(7)

在不设置MSVC_RUNTIME_LIBRARY属性时,它默认值为MultiThreaded$<$<CONFIG:Debug>:Debug>DLL,是MDMDd

更多细节参见官方教程:MSVC_RUNTIME_LIBRARY

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake设置MSVC工程MT/MTd/MD/MDd 的相关文章

随机推荐

  • 【Android 12 AOSP学习】Android 12源码下载编译

    一 搭建环境 liunx系统 Ubuntu20 04 Android系统 12 1 安装 Repo 下载Repo前先安装 curl 库 sudo apt get install curl 下载好 curl 库后 设置清华源下载 Repo 然
  • 前端 JavaScript 提取 JSON 数据

    原文地址 假如我们从后端接收到了以下 JSON 数据 id 1 name Xu Albter age 18 使用 JSON parse 方法处理以上数据 将其转换为 JavaScript 对象 var obj JSON parse id 1
  • select函数缺陷分析

    与poll和epoll不同 select函数是事件为单位组织文件描述符 监视的行为较为单一 函数原型 int select int nfds fd set readfds fd set writefds fd set exceptfds s
  • 链表应用:两数相加

    关于链表 链表是一种极其重要的数据结构 因为对指针和抽象思维的要求较高 一度成为身边同学最痛恨的对象 我在将这里演示如何使用链表制作一个可以按位储存数字的容器 鉴于本人亦初学者 有错误请各位在评论区指正 这里还是以介绍链表为主 算法部分苦于
  • SpringCloud和微服务介绍

    SpringCloud介绍 微服务架构是什么 微服务实例的开发 服务的注册与发现 负载均衡 服务容错 API网关 分布式配置中心 调试 部署 持续集成 SpringCloud介绍 SpringCloud是在SpringBoot的基础上构建的
  • 一个完整详细的二维SVR案例分析过程

    文章目录 案例介绍 数据预处理 函数拟合仿真 SVR建模 模型调参 案例介绍 首先 此次案例是以油气开发为背景 选取加粗样式其中重要的两个参数含油饱和度和孔隙度分别作为此次案例的自变量和因变量进行试验 按照正常的案例分析步骤进行操作 此次为
  • 神经网络(ANN)

    算法介绍 概念 人工神经网络是由具有适应性的简单单元组成的广泛并行互连的网络 它的组织能够模拟生物神经神经系统对真实世界物体所作出的交互反应 在实际应用中 80 90 的人工神经网络模型是采用误差反转算法或其变形形式的网络模型 一个神经网络
  • 小程序的配置文件和小程序的模板语法

    微信小程序 小程序的配置文件 一个小程序应用程序会包括 会有最基本的两种配置文件 一种是全局的 app json 一种是页面自己的 page json 注意 配置文件中不可以出行注释 1 1 全局配置文件 app json app json
  • 主题模型(Topic Model)与LDA算法

    Topic Model 主题模型 Topic Model 是以非监督学习的方式对文档的隐含语义结构 latent semantic structure 进行聚类 clustering 的统计模型 主题模型认为在词 word 与文档 docu
  • 第十三章:QT多线程(QThread)

    回顾 第一章 Qt的概述 第二章 在Ubuntu编写第一个Qt程序 第三章 Qt的字符串和字符编码 第四章 Qt的信号和槽 第五章 Qt容器窗口 父窗口 第六章 面向对象的Qt编程 第七章 Qt设计师使用 designer 第八章 Qt创造
  • Unittest框架多个testcase之间全局变量的调用

    unittest模块进行接口自动化的时候遇到以下场景 新增 修改 查看 删除一个项目配置流程 但是每次用真实数据请求 数据库就会增加很多脏数据 所以就产生了数据一条龙服务 从新增到删除 涉及到了Unittest下个接口需要调用上个接口的返回
  • mysql数据库访问控制查询_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

    数据库服务器通常包含着关键的数据 所以为了确保这些数据的安全和完整需要要利用访问控制 MySQL服务器的安全基础是 用户应该对他们需要的数据具有适当的访问权 既不能多也不能少 即用户不能对过多的数据具有访问权 访问控制 需要给用户提供他们所
  • 电子计算机的发展史

    1 电子计算机元器件变化 继电器 真空管 晶体管 2 计算机的出现背景 20世纪人口暴增 科学与工程进步迅速 航天计划成形 以上导致数据的复杂度急剧上升 计算量暴增 对于计算的自动化 高速有迫切的需求 3 电子计算机的发展 1945年 哈佛
  • antd table合并行或者列(动态添加合并行、列)

    antd table合并行或者列 动态添加合并行 列 表头只支持列合并 使用 column 里的 colSpan 进行设置 表格支持行 列合并 使用 render 里的单元格属性 colSpan 或者 rowSpan 设值为 0 时 设置的
  • Ubuntu系统安装企业微信和微信

    一 Ubuntu16 04安装企业微信 1 安装git工具 sudo apt install wget g git 2 安装deepin wine git clone https gitee com wszqkzqk deepin wine
  • UE4 行为树装饰器(Decorator)简单实用说明(1)

    在行为树标准模型中 条件语句为 Task 叶节点 除成功和失败外不执行任何操作 虽然也可以使用传统的条件 tasks 但还是强烈推荐您使用 Decorator 系统作为条件语句 使用 decorators 而非 tasks 作为条件语句有多
  • 光猫超级账号密码、宽带账号密码 获取

    光猫超级账号密码 宽带账号密码 获取 目的与起因 租房宽带是电信的 Ipv6 之前笔记本使用 Ipv6 地址可以直接被手机通过移动网络无需中转进行远程桌面连接的 目前尝试了在局域网内是可以实现的 应该是电信屏蔽了3389端口 在光猫路由器修
  • tcp 序列号

    父 tcp 状态 from异常流程 个人渣记录仅为自己搜索用的博客 CSDN博客 转载请注明出处 6 TCP6 TCP 协议 序号和确认号 tcp 最终确认序号 Allen 的博客 CSDN博客6 TCP 接下来的内容是学习后续内容的基础
  • Python Pandas 数据拼接/排序/重置

    Pandas 数据拼接 排序 重置 一 数据拼接 1 1 行拼接 纵向 第 0 维 pd concat df1 df2 1 2 列拼接 横向 第 1 维 pd concat df1 df2 axis 1 二 排序 2 1 从小到大排序 默认
  • CMake设置MSVC工程MT/MTd/MD/MDd

    文章目录 0 前言 1 如何设置 1 1 CMakeLists代码 1 2 要点1 POLICY 1 3 要点2 set property 0 前言 在MSVC工程上右键 gt 属性 找到配置属性 gt C C gt 代码生成 gt 运行库