2011-05-22 68 views
11

我正在努力獲得gcov的覆蓋範圍信息。在編譯和鏈接期間沒有錯誤,但是當我運行可執行文件時,不會生成覆蓋率數據。gcov與CMake使用獨立的構建目錄

我使用CMake的一個單獨的編譯目錄,通過標誌來編譯和鏈接以這樣的方式

add_definitions(--coverage) 
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage") 

是否可執行期望的源代碼是在一個特定的位置? 我必須添加到我的CMakeLists.txt才能完成任務嗎?

親切的問候, 比約恩·

回答

3

不知道你在哪裏得到--coverage從,但這些都是我用在Linux上使用gcc和gcov的獲取覆蓋信息的參數:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") 
set(CMAKE_EXE_LINKER_FLAGS 
    "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") 

這裏是gcc --help --verbose有說說這些選項:

-ftest-coverage創建 需要的數據文件「gcov」

-fprofile弧插入 圓弧基於程序取樣代碼

+2

當使用Clang時,'--coverage'做了這兩個參數在較短格式中所做的事情。 – jackyalcine 2013-08-28 05:27:56

+0

GCC支持'--coverage' https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html – mloskot 2018-02-09 00:22:50

0

你不需要--coverage傳給連接。 --coverage會將-fprofile-arcs -ftest-coverage傳遞給編譯器,並將-lgcov傳遞給鏈接器。

你確定它沒有創建任何gcdo或gcda文件嗎?你在哪裏尋找這些文件?它應該將每個目標文件的gcov文件放到與目標文件相同的目錄中。在build目錄的頂部找到.gcda文件。如果沒有顯示出來,gcov的可能不會得到在鏈接運行以下命令,看它是否是:

nm name_of_binary | grep "gcov" 

如果得到鏈接中,然後gcov的可能沒有權限將文件寫入到你在哪裏運行可執行文件。如果它有權限,那我就難住了。

12

CMake似乎把代碼覆蓋率(* .gcda,* .gcdo)文件與您的項目的目標文件。如果你的可執行文件被命名爲「測試」,那麼他們將出現在以下路徑

${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/ 

的CMake似乎命名的方式,不符合的gcov非常兼容,雖然源文件。例如,如果我有所謂的「mytestprog.cpp」源文件時,它會建立

mytestprog.cpp.o 
mytestprog.cpp.gcda 
mytestprog.cpp.gcdno 

其中作爲gcov的似乎期待

mytestprog.gcda 
mytestprog.gcdno 

我真的不知道如何解決它。我嘗試過使用LCov,並且「出現」了,但我不確定它是否確實如此。

+1

由於某些原因,您可以通過僅指定對象文件並將僞造值作爲源文件傳遞來獲取配置文件信息。例如:'gcov -o mytestprog.cpp.o x'將產生'mytestprog.cpp.gcov'。 – bcmpinc 2012-07-03 15:36:58

+0

@bcmpinc雖然它將無法檢查您在該文件中使用的標題。 – jackyalcine 2013-08-28 05:27:15

8

Delcypher指出了這個問題。

解決方案1:你可以問cmake使用無證CMAKE_CXX_OUTPUT_EXTENSION_REPLACE開關來命名對象文件爲main.o,而不是main.cpp.o等:

cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ... 

解決方案2:如果你不需要.gcov文件您可以從build目錄調用lcov

lcov --capture --directory . --output-file coverage.info 
genhtml coverage.info --output-directory out 

您可以在html格式的out目錄中找到覆蓋範圍信息。