Comments 1
Ох, намаялись мы с этой статической линковкой рантайма…
Поставили очень давно, когда проект был небольшой а cmake не такой продвинутый. Сама постановка уже была очень костыльная (ещё до проекта cmake подсунуть ему файлы с "правильными" flag_overrides), и рулить такой сущностью, что теперь во флагах компилятора вместо одной буковки стоит другая казалось ненужным.
Последние увлекательные приключения были из-за этого с boost. Ему можно сказать, какой конфиг мы хотим использовать. Но вот про static runtime (если он уже стоит в основном проекте) нужно говорить обязательно; молчать нельзя! И нужно говорить правильно (да, нужен!). Иначе сборки не будет. По итогу, подумав, решили таки теперь вернуться к "традиционному" динамическому рантайму. Особых настроек стало гораздо меньше и все дела проще. А для копирования (редистрибуции) нужных либ в cmake есть спец. модуль InstallRequiredSystemLibraries. Если особого резона в использовании именно статика нет, то включение этого модуля решает те же проблемы, что и включение статика (получается кросс-виндовый бинарь, хоть и со "свитой"), и при этом избавляет от множества скрытых эффектов, обусловленных статиком.
Сейчас (в нынешнем cmake) это хоть и можно стало ставить более цивилизованно
set_property(TARGET foo PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
в смысле, что теперь при желании узнать рантайм не надо парсить строку опций компилятора, а достаточно прочитать property проекта — но это всё равно не работает с тем же бустом )
Опыт команды PVS-Studio: повышение производительности C++ анализатора на Windows при переходе на Clang