=====Configuration===== ====Exécution de cmake==== * ''toolset'' ^Visual Studio^toolset^ |80 |2005 | |90 |2008 | |100 |2010 | |110 |2012 | |120 |2013 | |140 |2015 | |141 |2017 | |142 |2019 | |143 |2022 | Puis appeler cmake -T v142 -G "Visual Studio 16 2019" Il faut bien mettre les deux. Sinon, l'erreur suivante risque d'arriver : $ cmake .. -T version=v142 -- Building for: Visual Studio 17 2022 [[https://gitlab.kitware.com/cmake/cmake/blob/master/Help/variable/MSVC_TOOLSET_VERSION.rst|MSVC_TOOLSET_VERSION]] {{ :prog:cmake:msvc_toolset_version.txt |Archive du 20/09/2019}} ====CMakeLists.txt==== * Activer la compilation multiprocesseur /MP Cela active la compilation en parallèle des fichiers sources. Pas la compilation en parallèle des projets. add_compile_options($<$:/MP>) [[https://stackoverflow.com/questions/33858455/how-to-configure-cmake-in-a-way-that-it-generates-visual-studio-2013-project-fi|How to configure cmake in a way that it generates Visual Studio 2013+ project files with /MP option]] {{ :prog:cmake:vs:how_to_configure_cmake_in_a_way_that_it_generates_visual_studio_2013_project_files_with_mp_option_-_stack_overflow_2019-11-29_20_31_20_.html |Archive du 22/11/2015 le 29/11/2019}} * ''target_include_directories'' L'utilisation de l'option ''SYSTEM'' permet de désactiver les warnings venant des ''include'' "système". Seulement, Visual Studio ne fera pas non plus d'indexation des entêtes ''*.h'' / ''*.hpp'' dans ces sous-dossiers. Théorie à confirmer =====Exécution===== * Exécution en parallèle des projets L'activation de la compilation en parallèle des projets désactive la compilation en parallèle des fichiers source. [[https://gitlab.kitware.com/cmake/cmake/-/issues/20564|cmake --build: --parallel when used with msbuild does not enable parallelism within a project]] {{ :prog:cmake:vs:cmake_--build_--parallel_when_used_with_msbuild_does_not_enable_parallelism_within_a_project_20564_issues_cmake_cmake_gitlab_22_08_2022_12_17_14_.html |Archive du 09/04/2020 le 22/08/2022}} Pour activer la compilation en parallèle des fichiers source en ligne de commande, il est possible d'utiliser (pour Visual Studio seulement) : cmake --build . -- /p:CL_MPcount=8 =====Messages d'erreur===== * ''RuntimeLibrary'', ''MTd_StaticDebug'' et ''MDd_DynamicDebug'' Normalement, si les fichiers ''CMakeLists.txt'' sont bien fait, le générateur de projet ''Visual Studio'' de ''CMake'' devrait correctement mettre les bonnes valeurs par défaut. error LNK2038: discordance détectée pour 'RuntimeLibrary' : la valeur 'MTd_StaticDebug' ne correspond pas à la valeur 'MDd_DynamicDebug' in xxx.obj error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in xxx.obj C'est que les deux fichiers objets non pas été compilé avec le même paramètre ''/M'' (''/MD'', ''/MT'', ''/MDd'', ''/MTd''). Solution : ajouter [[https://cmake.org/cmake/help/git-stage/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html|CMAKE_MSVC_RUNTIME_LIBRARY]] (et ajuster) au ''CMakeLists.txt'' racine (cmake minimum 3.15): set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") [[https://stackoverflow.com/questions/10113017/setting-the-msvc-runtime-in-cmake|Setting the MSVC runtime in CMake]] {{ :prog:cmake:vs:visual_studio_-_setting_the_msvc_runtime_in_cmake_-_stack_overflow_2021-04-10_21_54_38_.html |Archive du 11/04/2012 le 10/04/2021}} * ''%%__%%acrt_first_block == header'' Ici, c'est l'inverse du paragraphe précédent. Il faut désactiver la ligne ''CMAKE_MSVC_RUNTIME_LIBRARY''. Bref... Il faut faire bien attention à ce que toutes les librairies soient compilées avec les mêmes options. [[https://stackoverflow.com/questions/35310117/debug-assertion-failed-expression-acrt-first-block-header|Debug Assertion Failed! Expression: __acrt_first_block == header]] {{ :prog:cmake:vs:c_-_debug_assertion_failed_expression_acrt_first_block_header_-_stack_overflow_2021-04-10_21_54_28_.html |Archive du 10/02/2016 le 10/04/2021}}