=====Configuration=====
====Exécution de cmake====
* Toolset (''-T'')
^Visual Studio^toolset^
|80 |2005 |
|90 |2008 |
|100 |2010 |
|110 |2012 |
|120 |2013 |
|140 |2015 |
|141 |2017 |
|142 |2019 |
|143 |2022 |
Il est aussi possible de spécifier l'architecture du host (du compilateur) et sa version: ''v143,version=14.36.17.6,host=x64''
[[https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html#variable:CMAKE_GENERATOR_TOOLSET|CMAKE_GENERATOR_TOOLSET]] {{ :prog:cmake:vs:cmake_generator_toolset_cmake_3.31.2_documentation_10_12_2024_22_23_40_.html |Archive du 3.31.2 le 10/12/2024}}
* Architecture (''-A'')
Liste des possibilités: ''x64'', ''Win32'', ''ARM'', ''ARM64''.
* Générateur (''-G'')
^Générateur^
|''Visual Studio 6''|
|''Visual Studio 7''|
|''Visual Studio 7 .NET 2003''|
|''Visual Studio 8 2005''|
|''Visual Studio 9 2008''|
|''Visual Studio 10 2010''|
|''Visual Studio 11 2012''|
|''Visual Studio 12 2013''|
|''Visual Studio 14 2015''|
|''Visual Studio 15 2017''|
|''Visual Studio 16 2019''|
|''Visual Studio 17 2022''|
Puis appeler
cmake -T v142 -G "Visual Studio 16 2019" -A x64
Il faut bien mettre les trois. 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}}
[[https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html|cmake-generators]] {{ :prog:cmake:vs:cmake-generators_7_cmake_3.31.2_documentation_10_12_2024_22_18_04_.html |Archive du v3.31.2 le 10/12/2024}}
====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}}