2016-03-21 23 views
5

私はLinuxマシン上で、ソースビルド外のcmakeを使ってプロジェクトを構築しようとしています。コードカバレッジのために、私はgcovを調べて、サンプルhelloWorld.cppプログラムの適切なファイルを生成する簡単なチュートリアルに従った。唯一の必要条件は-fprofile-arcs -ftest-coverageフラグと-lgcovフラグのリンクでコンパイルすることでした。これはすべて-coverageフラグで行うことができます。cmakeでコードカバレッジを設定しています

ここではトリッキーな部分があります。以下に示すように、私はCMakeLists.txtウィットの内容を持っている:

cmake_minimum_required (VERSION 2.8) 
project (SomeName) 

SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -coverage -fprofile-arcs -ftest-coverage") 
SET(GCC_COVERAGE_LINK_FLAGS "-coverage -lgcov") 
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}") 
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") 

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 

include_directories(include) 
set(CATCH_HEADER_PATH ${PROJECT_SOURCE_DIR}/test/catch.hpp) 

add_executable(runTest ${PROJECT_SOURCE_DIR}/test/test.cpp ${CATCH_HEADER_PATH}) 

だから私は、あまりにも適切なコンパイル時のフラグだけでなく、リンカのフラグを含めましたし、それらを正しく追加しました。もう1つの注意点はset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)行で、binディレクトリ内に実行ファイルが生成されることを示しています。

カバレッジファイルが正しく生成されないことを除いて、すべてが意図したとおりに機能します。私は、次の手順を実行します。

mkdir build && cd build 
cmake .. 
make -j4 
./bin/runTest 

し、他のファイルがbinフォルダ内に生成されません。 test.cpp.gcda & test.cpp.gcno生成されている - しかし、より多くの検査に私はtest.cpp.oが最初に常駐し、最終段階./bin/runTest後、2つの新しいファイルを別の場所build/CMakeFiles/runTest.dir/testがあることが分かりました。

私はすでにtest/test.cppbuild/CMakeFiles/runTest.dir/testにをコピーしgcov test.cppを実行しようとしましたが、それは述べて失敗した - test.gcno:cannot open notes file

+0

私はこの質問[ここ](https://github.com/agauniyal/rang)の更新CMakeLists.txtをプッシュしました。誰でもこのレポを使用して簡単に再現することができます。 –

+3

ソースファイルとgcovデータファイル( '.gcno'、' .gcda')が* different *ディレクトリに置かれている場合、それらが見つかる場所で 'gcov'をヒントする必要があります。たとえば、gcovにオプション '-o 'を渡して、データファイルの場所を指定することができます。あなたの質問の投稿に記載されているすべてのものが正しく動作します。 – Tsyvarev

+1

可能なdup http://stackoverflow.com/questions/13116488/detailed-guide-on-using-gcov-with-cmake-cdashこちらのドキュメントもチェックしてください。https://cmake.org/cmake/help/v3.2/モジュール/ CTestCoverageCollectGCOV.html –

答えて

3

をgcovのとgccバージョンの不一致はこれが起こる作っていました。 gcc symlink /usr/bin/gccは、最新のgccに設定され、g++と同じですが、gcov$PATHは、依然として古いバージョンgcovを指していました。

関連する問題