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を読むことができません。それらは少し不可解です。
コンパイラの警告の位置は分かれています。パッケージメンテナがいて、彼らが何をしているのかを知っていることを教えてくれます。どのような場合でもコンパイラの警告は無視する必要があります。 (私は彼らがこれ以上間違っていなかったと思います。)しかし、私はそれが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警告に関してコンパイラができることを見つけてください...