2016-03-21 98 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}) 

所以我已經包括適當的編譯時間標誌以及連接標誌太正確附加它們。另外需要注意的是set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)這一行,表示將在bin目錄內生成可執行文件。

現在一切都按預期工作,但覆蓋文件沒有正確生成。我請按照下列步驟操作:

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

和內部bin文件夾中生成任何其他文件。然而更多的檢查,我發現,還有另外一個位置build/CMakeFiles/runTest.dir/test其中test.cpp.o初始存在和最後一步./bin/runTest,兩個新文件之後 - 生成test.cpp.gcda & test.cpp.gcno

我已經嘗試複製test/test.cppbuild/CMakeFiles/runTest.dir/test和運行gcov test.cpp但它沒有說明 - test.gcno:cannot open notes file

+0

我推這個問題的更新CMakeLists.txt [這裏](https://github.com/agauniyal/rang)。任何人都可以使用這個回購快速repro。 –

+3

當源文件和gcov數據文件('.gcno','.gcda')位於*不同*目錄中時,您需要提示'gcov'在哪裏可以找到它們。例如,您可以將選項'-o '傳遞給gcov以指定數據文件的位置。在您的問題中描述的其他所有內容都能正常工作 – Tsyvarev

+1

可能的複製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符號鏈接/usr/bin/gcc被設置爲最新gccg++相同,但gcov$PATH仍然指向舊版本gcov