在Release模式下,无法将CMake中的/MD替换为/MT



我有一个C++库,我想在发布模式下使用带有/MT编译器选项的Visual Studio 2017(CMake/Ninja(对其进行编译。在这里,我之前问过一个类似的问题。这个问题的答案有帮助,但会导致编译器抱怨(报告警告(用/MT覆盖/MD。然后我使用了这个解决方案,但在RELEASE模式下设置CMAKE_CXX_FLAG_RELEASE对编译器命令行参数没有影响。我的意思是,以下代码在调试模式下运行良好:

set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE)
foreach(CompilerFlag ${CompilerFlags})
message("before replace: " ${${CompilerFlag}})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
message("after replace: " ${${CompilerFlag}})
endforeach()

运行CMake的结果是:

before replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
after replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
before replace: /MDd /Zi /Ob0 /Od /RTC1
after replace: /MTd /Zi /Ob0 /Od /RTC1
before replace: /MD /O2 /Ob2 /DNDEBUG
after replace: /MT /O2 /Ob2 /DNDEBUG

构建的结果是:

cl.exe  ... /MTd ...

在Release模式下,运行CMake的结果将是相同的;然而,构建的结果是:

cl.exe  ... /MD ...

如果你知道做这件事的正确方法是什么,我会非常感激听到这个消息。

经过长时间的

TARGET_COMPILE_OPTIONS(${library_name} PRIVATE "/MT$<$<CONFIG:Release>:>")