web-dev-qa-db-fra.com

Avertissements de CMake et du compilateur

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.

23
Evgeny Lazin

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.

Appliquer à une seule cible

if ( CMAKE_COMPILER_IS_GNUCC )
    target_compile_options(main PRIVATE "-Wall -Wextra")
endif()
if ( MSVC )
    target_compile_options(main PRIVATE "/W4")
endif()

Appliquer à toutes les cibles

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 ...

32
DevSolar