[英]Compile with /MT instead of /MD using CMake
我在帶有 Windows SDK 和 NMake Makefiles 的 Windows 上使用 CMake。
默認情況下,它使用/MD
編譯器開關進行編譯。
如何更改它以使用/MT
開關編譯?
您可以修改CMAKE_CXX_FLAGS_<Build Type>
和/或CMAKE_C_FLAGS_<Build Type>
變量:
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
如果您的 CMake 標志已經包含/MD
,您可以確保在插入/MD
的點之后執行上述命令(后來添加的/MT
覆蓋了沖突的現有選項),或者您可以從頭開始設置標志:
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
或者,您可以通過執行/MTd
分別用/MT
和/MTd
替換現有的/MD
和/MDd
值:
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()
CMake 最終在版本 3.15 中使用MSVC_RUNTIME_LIBRARY
目標屬性添加了對此的適當支持:
cmake_minimum_required(VERSION 3.15)
cmake_policy(SET CMP0091 NEW)
project(my_project)
add_executable(foo foo.c)
set_property(TARGET foo PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
您還可以通過設置CMAKE_MSVC_RUNTIME_LIBRARY
變量來指定全局默認值。
似乎對於Visual Studio 15 2017和CMake 3.12 ,將/MD
替換為/MT
是將此代碼段添加到 CMakeLists.txt 文件中:
if(MSVC)
add_compile_options(
$<$<CONFIG:>:/MT> #---------|
$<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
$<$<CONFIG:Release>:/MT> #--|
)
endif()
我在官方 CMake 存儲庫中找到了這個解決方案: https : //gitlab.kitware.com/cmake/cmake/issues/18390
查看ucm_set_runtime - 此宏將替換靜態或動態運行時的標志 - 要查看效果,請使用ucm_print_flags (也請查看此堆棧溢出問題)。
我必須使用set( ... CACHE ... FORCE)
來覆蓋 MSVC 的默認緩存。
如果我不使用這種方法,MSVC 仍然會輸出/MD
選項。
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
message("MSVC flags: ${CompilerFlag}:${${CompilerFlag}}")
endforeach()
從 cmacke 3.15 開始,您可以使用MSVC_RUNTIME_LIBRARY
。 見https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.