文章目录

  • 0. 前言
  • 1. 如何设置
    • 1.1 CMakeLists代码
    • 1.2 要点1:POLICY
    • 1.3 要点2:set_property

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 PROPERTYMSVC_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。

CMake设置MSVC工程MT/MTd/MD/MDd相关推荐

  1. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  2. VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别

    VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别 VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) C ...

  3. cmake:解决MSVC下/MT 编译paho.mqtt.c的问题

    paho.mqtt.c是eclipse开发的C语言跨平台mqtt client 开源库,之前写过一篇博客<cmake:VS2015和GCC编译paho.mqtt C/C++ client> ...

  4. /MTd /MD /MDd

    在编译 ATL 工程后,生成的 dll 在本电脑上能用,在别人的电脑上不能用.通过 Depends 工具分析一下,原来是编译选项没有选对,别的电脑上没有我生成的 dll 需要的基础 dll 文件,选成 ...

  5. CMAKE设置INSTALL工程,分别设置头文件、Lib和DLL的输出路径

    使用CMAKE管理工程,可以设置工程中的INSTALL项目运行时安装的路径,使用命令:install. 可以简单的设置安装文件的路径和文件夹: set(head_files//要安装的头文件 ) in ...

  6. CMake设置VS工程筛选器

    按目录结构自动创建Filter 使用参考2中的工程,参考4中的cmake文件配置,得到的结果. 代码目录结构如下: │ CMakeLists.txt ├─bin │ ├─main │ main.cpp ...

  7. 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD

    一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...

  8. vs MD /MDD /ML /MT /MTD的简单介绍

    1.MD /MDD /ML /MT /MTD的简单介绍 在编译ATL工程后,生成的dll在本电脑上能用,在别人的电脑上不能用.通过Depends工具分析一下,原来是编译选项没有选对,别的电脑上没有我生 ...

  9. /MD, /MDD, /ML, /MT,/MTD(使用运行时库)

    1. VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) 2. C 运行时库                              ...

最新文章

  1. PowerShell过滤文件中的重复内容
  2. java MD5 加密
  3. Spark1.0.0 开发环境高速搭建
  4. 攻防世界Reverse第一题Hello, CTF
  5. Docker仓库搭建
  6. Silverlight 下换肤的实现
  7. C语言指针(1)嵌入式linux
  8. Lazy Evaluation(延迟执行)
  9. redistemplate 设置失效时间_开发新技能之利用Redis高级用法监听过期键处理失效的订单...
  10. Java分布式锁看这篇就够了,java基础面试笔试题
  11. quagga源码分析--大内总管zebra
  12. P3244 [HNOI2015]落忆枫音
  13. java通过smtp发送电子邮件
  14. javascript offsetLeft,Left,clientLeft 各种浏览器位置相关属性
  15. 局域网文件共享软件 开源_4个用于共享文件的开源工具
  16. python自定义函数拟合_python自定义函数拟合
  17. Vue学习day03(vscode)
  18. 地图php,php调用google地图
  19. git、gitlab+jenkens版本控制的安装、升级与灾备
  20. Kettle本机编译

热门文章

  1. 不被多数人知道但却超好的东东
  2. Rust 五分钟了解,三十分种入门
  3. 从婚恋网站危机到6千亿元蛋糕
  4. 面板产能过剩持续,京东方前景不明朗
  5. iPhone手机查找朋友怎么用?添加对方号码,瞬间变成追踪器
  6. Beautiful Soup 之 select详解
  7. 双非渣本小Android四年磨一剑,秋招大厂(字节、腾讯、B站)面经分享
  8. 论文他引次数及ESI高被引论文查询方法
  9. 智慧营销 让营销更精准
  10. laya的tween的坑