【问题标题】:Replacing /MD with /MT in CMake is not possible in Release mode在发布模式下,无法在 CMake 中将 /MD 替换为 /MT
【发布时间】:2023-04-07 08:26:01
【问题描述】:

我有一个 C++ 库,我想在发布模式下使用带有 /MT 编译器选项的 Visual Studio 2017 (CMake/Ninja) 对其进行编译。 Here,我之前问过一个类似的问题。该问题的答案有所帮助,但导致编译器抱怨(报告警告)关于用 /MT 覆盖 /MD。然后我使用了this solution,但是设置CMAKE_CXX_FLAGS_RELEASE 对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 ...

在发布模式下运行 CMake 的结果是一样的;但是,构建的结果是:

cl.exe  ... /MD ...

如果您知道这样做的正确方法是什么,我将不胜感激。

【问题讨论】:

  • 你确定你使用过 CMAKE_BUILD_TYPE=Release 吗?起初它似乎对我不起作用,但我使用了 RelWithDebInfo 并且为此您需要将 CMAKE_CXX_FLAGS_RELWITHDEBINFO 添加到修补变量列表中。 Fwiw 我正在使用带有 VS2017 的 Ninja Generator。
  • 感谢 Dominik 的评论。你说的对。在我写这篇文章的时候,我不知道 CMake 有更多的构建类型,比如 RelWithDebInfo。实际上我的(默认)构建类型是 CMakeSettings.json 中的 RelWithDebInfo ,我不知道它;因此,我操作了一个错误的变量(CMAKE_CXX_FLAGS_RELEASE)。

标签: cmake visual-studio-2017 ninja


【解决方案1】:

经过长时间的努力,它可以工作

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

【讨论】:

    最近更新 更多