设置在C进行MSVC运行(Setting the MSVC runtime in CMake)

2019-06-23 13:19发布

我下面的CMake的FAQ中的指示“我怎样才能建立我的静态运行MSVC应用程序?” 集中的MSVC运行时的一堆嵌套的CMake项目的选择(他们拉在为Git的子模块,并使用CMake的公司加入到主项目find_package()指令)。

所以,我写了这个CMake的宏:

macro(configure_msvc_runtime)
  if(MSVC)

    # Default to statically-linked runtime.
    if("${MSVC_RUNTIME}" STREQUAL "")
      set(MSVC_RUNTIME "static")
    endif()

    # Set compiler options.
    set(variables
      CMAKE_C_FLAGS_DEBUG
      CMAKE_C_FLAGS_MINSIZEREL
      CMAKE_C_FLAGS_RELEASE
      CMAKE_C_FLAGS_RELWITHDEBINFO
      CMAKE_CXX_FLAGS_DEBUG
      CMAKE_CXX_FLAGS_MINSIZEREL
      CMAKE_CXX_FLAGS_RELEASE
      CMAKE_CXX_FLAGS_RELWITHDEBINFO
    )
    if(${MSVC_RUNTIME} STREQUAL "static")
      message(STATUS
        "MSVC -> forcing use of statically-linked runtime."
      )
      foreach(variable ${variables})
        if(${variable} MATCHES "/MD")
          string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
        endif()
      endforeach()
    else()
      message(STATUS
        "MSVC -> forcing use of dynamically-linked runtime."
      )
      foreach(variable ${variables})
        if(${variable} MATCHES "/MT")
          string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}")
        endif()
      endforeach()
    endif()
  endif()
endmacro()

我叫我的根开始这个宏CMakeLists.txt (之前的任何 add_library()add_executable()调用时),并添加调试打印一点点:

configure_msvc_runtime()
set(variables
  CMAKE_C_FLAGS_DEBUG
  CMAKE_C_FLAGS_MINSIZEREL
  CMAKE_C_FLAGS_RELEASE
  CMAKE_C_FLAGS_RELWITHDEBINFO
  CMAKE_CXX_FLAGS_DEBUG
  CMAKE_CXX_FLAGS_MINSIZEREL
  CMAKE_CXX_FLAGS_RELEASE
  CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
message(STATUS "Initial build flags:")
foreach(variable ${variables})
  message(STATUS "  '${variable}': ${${variable}}")
endforeach()
message(STATUS "")

然后,我运行CMake的生成,像这样一个Visual Studio解决方案:

cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=dynamic

我得到以下的输出:

-- MSVC -> forcing use of dynamically-linked runtime.
-- Initial build flags:
--   'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1
--   'CMAKE_C_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
--   'CMAKE_C_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
--   'CMAKE_C_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
--   'CMAKE_CXX_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG

现在,事情是,当我启动Visual Studio和审查根据“C / C ++,代码生成”项目属性,我看到“运行时库”设置为不与外壳打印的选项是一致的。 在“释放”,“MinSizeRel”和“RelWithDebInfo”的配置,我得到预期的结果(“多线程DLL / MD”,但“调试”配置仍显示“多线程/ MT”)。

此外,当我强制使用静态链接的运行时,我得到了类似的结果。 如果我运行

cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=static

我得到以下的输出:

-- MSVC -> forcing use of statically-linked runtime.
-- Initial build flags:
--   'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MTd /Zi  /Ob0 /Od /RTC1
--   'CMAKE_C_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
--   'CMAKE_C_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
--   'CMAKE_C_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1
--   'CMAKE_CXX_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG

然而所有的配置产生的“运行时库”设置中的“多线程/吨”的价值。

我在做什么错了,或者如果这是在CMake的(2.8.7)或什么错误?


对于它的价值,如果我生成Visual Studio 2010中的项目文件,我得到了“调试”配置不同的值,但仍然不是我选择了一个。

在所有情况下,而它出现在粗体字体为其它配置中,暗示这些是覆盖设置出现在常规字体为“调试”配置。 此外,如果我打开XML项目文件,我发现“调试”配置具有的“工具”元件与“NAME = VCCLCompilerTool”属性中的“运行时库”属性没有设置。 所有其他配置有明确的设置。

Answer 1:

似乎所有我工作的这一段时间,我忘了删除坏CMake的配置,我试图取代。

再往下构建脚本,我已经离开这个小鸡奸:

set(CMAKE_CXX_FLAGS_DEBUG
  "/DWIN32 /D_WINDOWS /EHsc /WX /wd4355 /wd4251 /wd4250 /wd4996"
  CACHE STRING "Debug compiler flags" FORCE
)

基本上,我是通过重写的结果configure_msvc_runtime()宏与没有设置MSVC运行时生成的标志。



Answer 2:

我把你的代码,并推广它为每一个现有的配置,并不仅仅是为了调试/发布/ RelWithDebInfo / MinSizeRel工作。

此外,我做它与海湾合作委员会的工作太-看看这里



文章来源: Setting the MSVC runtime in CMake