CMake设置MSVC工程MT/MTd/MD/MDd
文章目录
- 0. 前言
- 1. 如何设置
- 1.1 CMakeLists代码
- 1.2 要点1:POLICY
- 1.3 要点2:set_property
0. 前言
在MSVC
工程上右键->属性,找到配置属性->C/C++->代码生成->运行库,会发现有好几种选项:MT MTd MD MDd
这是对于多线程程序生成对象链接内容的控制。
先理解一下这四个有什么不同:
- 首先后面带
d
表示Debug
,生成对象(exe、lib
都行)是带有调试信息的,生成对象占用空间相比不带d
的会更大一些; MT
和MD
区别:前者是静态链接,将有关依赖库都打包进生成对象了,所以占用空间更大;后者是动态链接,运行时依赖电脑环境,容易出现换个电脑报错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
通过选择策略的NEW
或OLD
,可以使用不同的语法,来实现同样的功能。详情可看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
)功能,使得当Config
是Debug
时,自动添加Debug
。使用到了嵌套表达式:
$<CONFIG:Debug>
使用了变量查询的语句,当处于Debug
模式时,该表达式为1
:
- 知道上一条之后,
<$<$<CONFIG:Debug>: Debug>
就变成了$<1或0:Debug>
,使用的是条件表达式,当前部分为1
是该表达式为Debug
,否则为空:
生成表达式可以参考官方:cmake-generator-expressions(7)。
在不设置MSVC_RUNTIME_LIBRARY
属性时,它默认值为MultiThreaded$<$<CONFIG:Debug>:Debug>DLL
,是MD
或MDd
。
更多细节参见官方教程:MSVC_RUNTIME_LIBRARY。
CMake设置MSVC工程MT/MTd/MD/MDd相关推荐
- vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)
vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...
- VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别
VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别 VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) C ...
- cmake:解决MSVC下/MT 编译paho.mqtt.c的问题
paho.mqtt.c是eclipse开发的C语言跨平台mqtt client 开源库,之前写过一篇博客<cmake:VS2015和GCC编译paho.mqtt C/C++ client> ...
- /MTd /MD /MDd
在编译 ATL 工程后,生成的 dll 在本电脑上能用,在别人的电脑上不能用.通过 Depends 工具分析一下,原来是编译选项没有选对,别的电脑上没有我生成的 dll 需要的基础 dll 文件,选成 ...
- CMAKE设置INSTALL工程,分别设置头文件、Lib和DLL的输出路径
使用CMAKE管理工程,可以设置工程中的INSTALL项目运行时安装的路径,使用命令:install. 可以简单的设置安装文件的路径和文件夹: set(head_files//要安装的头文件 ) in ...
- CMake设置VS工程筛选器
按目录结构自动创建Filter 使用参考2中的工程,参考4中的cmake文件配置,得到的结果. 代码目录结构如下: │ CMakeLists.txt ├─bin │ ├─main │ main.cpp ...
- 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD
一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...
- vs MD /MDD /ML /MT /MTD的简单介绍
1.MD /MDD /ML /MT /MTD的简单介绍 在编译ATL工程后,生成的dll在本电脑上能用,在别人的电脑上不能用.通过Depends工具分析一下,原来是编译选项没有选对,别的电脑上没有我生 ...
- /MD, /MDD, /ML, /MT,/MTD(使用运行时库)
1. VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) 2. C 运行时库 ...
最新文章
- PowerShell过滤文件中的重复内容
- java MD5 加密
- Spark1.0.0 开发环境高速搭建
- 攻防世界Reverse第一题Hello, CTF
- Docker仓库搭建
- Silverlight 下换肤的实现
- C语言指针(1)嵌入式linux
- Lazy Evaluation(延迟执行)
- redistemplate 设置失效时间_开发新技能之利用Redis高级用法监听过期键处理失效的订单...
- Java分布式锁看这篇就够了,java基础面试笔试题
- quagga源码分析--大内总管zebra
- P3244 [HNOI2015]落忆枫音
- java通过smtp发送电子邮件
- javascript offsetLeft,Left,clientLeft 各种浏览器位置相关属性
- 局域网文件共享软件 开源_4个用于共享文件的开源工具
- python自定义函数拟合_python自定义函数拟合
- Vue学习day03(vscode)
- 地图php,php调用google地图
- git、gitlab+jenkens版本控制的安装、升级与灾备
- Kettle本机编译