Petit souci avec CMake : le passage au C++11

CMake-logo

J’écris un court article sur un problème que je viens de rencontrer avec CMake qui m’a semblé étrange…

J’étais en train de tester quelques options de compilation pour un petit projet en C++, quand je me suis subitement dit que j’aimerais activer les fonctionnalités C++11, et que j’aimerais que ça affiche un message si le compilateur ne supporte pas le C++11.

Pas de souci, on trouve la solution sur comment faire ça avec CMake à plusieurs endroits sur Internet… J’ai opté pour la solution suivante (CMake 2.8 chez moi) :

1
2
3
4
5
6
7
8
9
10
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

Sauf que de manière assez étrange je continuais d’obtenir le message que j’avais moi-même ajouté « The compiler /usr/bin/c++ has no C++11 support. Please use a different C++ compiler. », alors que sur mon Linux /usr/bin/c++ est un lien symbolique vers un G++ 4.8 tout à fait capable d’activer le C++11.

J’ai trouvé mon salut en lisant cette question Stack Overflow. Le problème de cette personne était différent : elle voulait passer de Clang à G++, mais comme CMake ne gère pas le changement de compilateur « à chaud » (après configuration), la variable CMAKE_CXX_COMPILER n’est pas mise à jour une fois le premier setup mis en place.

Bien que mon problème n’avait pas grand-chose à voir (je n’ai pas changé de compilateur, je voulais juste activer le C++11), la solution était la même : il suffit de recréer le dossier « build » de CMake et de relancer la compilation du projet pour que les fichiers de configuration auto-générés de CMake soient recréés et que les changements de configuration soient bien pris en compte ; problème résolu !

À savoir que par ailleurs, il semble que le problème émanait d’une routine appelée par la commande CMake CHECK_CXX_COMPILER_FLAG. Essayer de setter directement le flag C++11 avec « set(CMAKE_CXX_FLAGS « ${CMAKE_CXX_FLAGS} -std=c++11″) » fonctionnait bien, mais on perdait alors toute la partie vérification.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.