J'utilise CMake
pour générer des makefiles Unix. Après cela, je compile le projet en utilisant l'utilitaire make
. Le problème est que je ne vois aucun avertissement! Par exemple, cela se traduit par une construction propre sans avertissements:
#include <iostream>
class Foo
{
int first;
int second;
public:
Foo(int a, int b)
: second(a) // invalid initialization order
, first(b)
{
}
};
int main(int argc, char** argv)
{
int unused; // unused variable
int x;
double y = 3.14159;
x = y; // invalid cast
Foo foo(1,2);
std::cout << y << std::endl;
return 0;
}
Distribution de variable inutilisée et de variable avec perte - aucun avertissement! Ma CMakeLists.txt
le fichier est minimaliste:
cmake_minimum_required(VERSION 2.8)
add_executable(main main.cpp)
Lorsque j'exécute cmake
puis make
ma sortie ressemble à ceci:
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main
Mais quand j'ajoute cette ligne de code:
#warning ("Custom warning")
la sortie résultante contient un avertissement:
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
../src/main.cpp:15:2: warning: #warning ("Custom Warning") [-Wcpp]
Linking CXX executable main
[100%] Built target main
J'utilise Ubuntu 12.04 LTS et GCC comme compilateur. Peut-être que CMake passe un indicateur au compilateur qui se traduit par l'absence d'avertissements. Comment puis-je le vérifier? Je ne peux pas lire les makefiles générés par CMake, ils sont un peu cryptiques.
Les positions sur les avertissements du compilateur sont divisées. Il y a des responsables de paquets qui vous diront qu'ils savent ce qu'ils font et les avertissements du compilateur doivent être ignorés dans tous les cas. (Je pense qu'ils ne pourraient pas être plus faux.) Mais je suppose que c'est pourquoi CMake laisse principalement les paramètres d'avertissement seuls.
Si vous voulez être un peu plus sophistiqué à ce sujet, vérifiez le compilateur utilisé et ajoutez l'indicateur à la propriété spécifique de la cible spécifique.
if ( CMAKE_COMPILER_IS_GNUCC )
target_compile_options(main PRIVATE "-Wall -Wextra")
endif()
if ( MSVC )
target_compile_options(main PRIVATE "/W4")
endif()
if ( CMAKE_COMPILER_IS_GNUCC )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
endif()
if ( MSVC )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
Remarque: ajoutez -Werror
pour GCC ou /WX
pour que MSVC traite tous les avertissements comme des erreurs. Cela traitera tous les avertissements comme des erreurs. Cela peut être pratique pour les nouveaux projets afin d'appliquer la rigueur des avertissements.
Aussi, -Wall -Wextra
ne signifie pas "toutes les erreurs"; historiquement -Wall
signifiait "toutes les erreurs sur lesquelles tout le monde pouvait s'entendre", et -Wextra
"un peu plus". Commencez par cela, puis parcourez le manuel de votre version de GCC, et trouvez ce que else le compilateur peut faire pour vous en ce qui concerne les avertissements ...