web-dev-qa-db-ja.com

CMakeおよびコンパイラーの警告

CMakeを使用してUNIXメイクファイルを生成します。その後、makeユーティリティを使用してプロジェクトをコンパイルします。問題は、警告が表示されないことです!たとえば、これにより警告なしにクリーンビルドが行われます。

#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;
}

未使用の変数と損失のある変数のキャスト-警告なし!俺の CMakeLists.txtファイルは最小限です:

cmake_minimum_required(VERSION 2.8)

add_executable(main main.cpp)

cmakeを実行してからmakeを実行すると、出力は次のようになります。

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main

しかし、次のコード行を追加すると:

#warning ("Custom warning")

結果の出力には警告が含まれます。

[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

Ubuntu 12.04 LTSとGCCをコンパイラとして使用します。 CMakeがコンパイラにフラグを渡して、警告が表示されない場合があります。どうすれば確認できますか? CMakeで生成されたmakefileを読むことができません。それらは少し不可解です。

21
Evgeny Lazin

コンパイラの警告の位置は分かれています。パッケージメンテナがいて、彼らが何をしているのかを知っていることを教えてくれます。どのような場合でもコンパイラの警告は無視する必要があります。 (私は彼らがこれ以上間違っていなかったと思います。)しかし、私はそれがCMakeがほとんど警告設定だけを残す理由だと思います。

それについてもう少し洗練されたい場合は、使用されているコンパイラを確認し、特定のターゲットの特定のプロパティにフラグを追加します。

単一のターゲットに適用する

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()

注:すべての警告をエラーとして扱うには、GCCの場合は-Werror、MSVCの場合は/WXを追加します。これにより、すべての警告がエラーとして扱われます。これは、新しいプロジェクトが警告の厳格さを強化するのに便利です。

また、-Wall -Wextraは「すべてのエラー」を意味しません。歴史的に-Wallは「すべてのエラー誰もが同意できる」、および-Wextra「その他」を意味していました。それから始めて、yourバージョンのGCCのマニュアルを熟読し、else警告に関してコンパイラができることを見つけてください...

27
DevSolar