Замена /MD на /MT в CMake невозможна в режиме Release

У меня есть библиотека C++, которую я хочу скомпилировать с помощью Visual Studio 2017 (CMake/Ninja) с параметром компилятора /MT в режиме выпуска. Здесь я задавал аналогичный вопрос некоторое время назад. Ответ на этот вопрос помог, но заставляет компилятор жаловаться (выдавать предупреждение) о переопределении /MD с помощью /MT. Затем я использовал это решение, но установка CMAKE_CXX_FLAGS_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 ...

Если вы знаете, как правильно это сделать, я буду очень признателен, если вы это услышите.


person wxShayan    schedule 24.07.2018    source источник
comment
Вы уверены, что использовали CMAKE_BUILD_TYPE=Release? Сначала у меня это не сработало, но я использовал RelWithDebInfo, и для этого вам нужно добавить CMAKE_CXX_FLAGS_RELWITDEBINFO в список исправленных переменных. Между прочим, я использую генератор ниндзя с VS2017.   -  person Dominik Schmidt    schedule 29.10.2018
comment
Спасибо, Доминик, за комментарий. Ты прав. Когда я писал этот пост, я не знал, что CMake имеет больше типов сборки, таких как RelWithDebInfo. На самом деле мой тип сборки (по умолчанию) был RelWithDebInfo в CMakeSettings.json, и я не знал об этом; поэтому я манипулировал неправильной переменной (CMAKE_CXX_FLAGS_RELEASE).   -  person wxShayan    schedule 01.11.2018


Ответы (1)


это работает после долгой борьбы

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