查了挺多帖子,试了多次,找到三种可行的方案。
方案一 通过target_compile_option
if(MSVC)
target_compile_options(MyProject PRIVATE
$<$<CONFIG:Release>:/MT>
$<$<CONFIG:Debug>:/MTd>
)
endif()
方案二 通过add_compile_options
if(MSVC)
add_compile_options(/guard:cf /MT)
endif()
方案三 通过cmake_policy
# 设置策略CMP0091为NEW,新策略
if (POLICY CMP0091)
cmake_policy(SET CMP0091 NEW)
endif (POLICY CMP0091)
# 设置MT/MTd
set_property(TARGET HelloVS PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
全部CMakeLists.txt
cmake_minimum_required(VERSION 3.27)
# 设置策略CMP0091为NEW,新策略
if (POLICY CMP0091)
cmake_policy(SET CMP0091 NEW)
endif (POLICY CMP0091)
project(HelloVS)
set(CMAKE_CXX_STANDARD 11)
#使用VS2022 作为编译器
#必须显式地告诉编程器 WIN32程序
add_executable(
HelloVS
WIN32
getProcessId.h
getProcessId.cpp
main.cpp
MemoryRW.cpp
MemoryRW.h
)
# 设置MT/MTd
set_property(TARGET HelloVS PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
# 链接到user32库
#target_link_libraries(HelloVS user32)
注意 通过CXX FLAGS不行
if(MSVC)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
这个方案网上流传很广,但实测无效、