Настройка среды выполнения MSVC в CMake

Я следую инструкциям в разделе часто задаваемых вопросов по CMake «Как мне создать приложение 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++, генерация кода», я вижу, что параметр «Библиотека времени выполнения» не соответствует параметрам, напечатанным в файле sh элл. В конфигурациях «Release», «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

И все же все конфигурации производят значение «Многопоточность /MT» для параметра «Библиотека времени выполнения».

Что я делаю неправильно, или это ошибка в CMake (2.8.7) или что-то в этом роде?


Как бы то ни было, если я создаю файлы проекта Visual Studio 2010, я получаю другое значение для конфигурации «Отладка», но все же не то, которое я выбрал.

Во всех случаях параметр отображается обычным шрифтом для конфигурации «Отладка», тогда как для других конфигураций он отображается полужирным шрифтом, намекая на то, что это переопределение. Более того, если я открою файлы проекта XML, я обнаружу, что конфигурация «Отладка» не имеет настройки для атрибута «RuntimeLibrary» элемента «Инструмент» с атрибутом «Имя = VCCLCompilerTool». Все остальные конфигурации имеют явную настройку.

38
задан Peter Mortensen 14 October 2018 в 18:13
поделиться