2016-03-21 39 views
5

Jestem na komputerze z systemem Linux, próbując zbudować projekt przy użyciu cmake, który nie ma kompilacji źródłowych. Jeśli chodzi o zasięg kodu, zaglądałem do gcov i postępowałem zgodnie z prostym samouczkiem, który generuje odpowiednie pliki dla przykładowego programu: helloWorld.cpp. Jedynym wymaganiem było skompilowanie z flagą flagi & z flagą -lgcov, która może być wykonana z flagą -coverage.konfigurowanie zasięgu kodu za pomocą cmake

Nadchodzi trudna część. Mam CMakeLists.txt zawartość wit jak pokazano poniżej:

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

Więc podaję odpowiednie kompilacji flagi czasie, jak również flagi linkera zbyt i dołączony je poprawnie. Inną rzeczą wartą odnotowania jest linia set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin), która mówi, że pliki wykonywalne będą generowane wewnątrz katalogu bin.

Teraz wszystko działa zgodnie z przeznaczeniem, z tym że pliki pokrycia nie są generowane prawidłowo. I wykonaj następujące kroki:

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

i żaden inny plik jest generowany wewnątrz bin folderu. Jednak na więcej kontroli okazało się, że istnieje inna lokalizacja build/CMakeFiles/runTest.dir/test gdzie test.cpp.o rezyduje na początku i po końcowym etapie ./bin/runTest dwa nowe pliki - test.cpp.gcda & test.cpp.gcno są generowane.

Ja już próbowałem kopiowanie test/test.cpp do build/CMakeFiles/runTest.dir/test i działa gcov test.cpp ale nie udaje stwierdzając - test.gcno:cannot open notes file

+0

Popchnąłem zaktualizowane CMakeLists.txt dla tego pytania [tutaj] (https://github.com/agauniyal/rang). każdy może użyć tego repozytorium do szybkiego repro. –

+3

Gdy pliki źródłowe i pliki danych gcov ('.gcno',' .gcda') znajdują się w * różnych * katalogach, musisz wskazać 'gcov', gdzie może je znaleźć. E.g, możesz przekazać opcję '-o ' do gcov, aby określić lokalizację plików danych. Wszystko inne opisane w twoim poście pytań działa poprawnie. – Tsyvarev

+1

możliwe dup http://stackoverflow.com/questions/13116488/detailed-guide-on-using-gcov-with-cmake-cdash również sprawdź dokumentację tutaj https://cmake.org/cmake/help/v3.2/ module/CTestCoverageCollectGCOV.html –

Odpowiedz

3

niedopasowanie gcov i wersja gcc robił to zdarzyć. gcc symlink /usr/bin/gcc został ustawiony na najnowszy gcc, taki sam dla g++, ale gcov w $PATH wciąż wskazywał na starszą wersję gcov.