28

私はCMakeUNIXメイクファイルを生成するために使用します。その後、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)

実行するcmakemake、出力は次のようになります。

[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 を読み取ることができません。少し暗号化されています。

4

2 に答える 2

43

コンパイラ警告の位置が分割されています。彼らが何をしているのかを知っているとあなたに言うパッケージメンテナーがいて、コンパイラの警告はどんな場合でも無視されるべきです. (私は彼らがもっと間違っているとは思わない.) しかし、それが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()

注: -WerrorGCC または/WXMSVC に追加して、すべての警告をエラーとして扱います。これにより、すべての警告がエラーとして扱われます。これは、新しいプロジェクトで警告の厳格さを強制するのに便利です。

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

于 2013-01-09T12:19:02.087 に答える
-4

次のコード行で問題を解決します。

add_definitions ("-Wall")

結果は次のようになります。

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
../src/main.cpp:15:2: warning: #warning ("Custom warning") [-Wcpp]
../src/main.cpp: In constructor ‘WarnSrc::WarnSrc(int, int)’:
../src/main.cpp:6:9: warning: ‘WarnSrc::second’ will be initialized after [-Wreorder]
../src/main.cpp:5:9: warning:   ‘int WarnSrc::first’ [-Wreorder]
../src/main.cpp:8:5: warning:   when initialized here [-Wreorder]
../src/main.cpp: In function ‘int main(int, char**)’:
../src/main.cpp:19:9: warning: unused variable ‘unused’ [-Wunused-variable]
../src/main.cpp:20:9: warning: variable ‘x’ set but not used [-Wunused-but-set-variable]
Linking CXX executable main
[100%] Built target main
于 2013-01-09T11:30:31.907 に答える