Linux C/C++產生覆蓋率

在Linux上的c/c++開發一般都使用gcc/g++作爲主要的編譯器,如果需要產生覆蓋率數據需要在Makefile或者Scons文件中做下面的編譯鏈接設置:

  • 編譯的時候,增加 -fprofile-arcs -ftest-coverage 或者 –coverage
  • 鏈接的時候,增加 -fprofile-arcs 或者 –lgcov
  • 打開–g3 選項,去掉-O2以上級別的代碼優化選項,否則編譯器會對代碼做一些優化,例如行合併,從而影響行覆蓋率結果。

Scons是一個開放源碼、以Python語言編碼的自動化構建工具,可用來替代make編寫複雜的makefile。並且scons是跨平臺的,只要scons腳本寫的好,可以在Linux和Windows下隨意編譯。
SCons 的設計目標就是讓開發人員更容易、更可靠和更快速的建造軟件。
與傳統的 make 工具比較,Scons 具有以下優點:

  • 使用 Python 腳本做爲配置文件
  • 對於 C,C++ 和 Fortran, 內建支持可靠自動依賴分析 . 不用像 make 工具那樣需要 執行"make depends"和"make clean"就可以獲得所有的依賴關係。
  • 內建支持 C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及 Tex/Latex。 用戶還可以根據自己的需要進行擴展以獲得對需要編程語言的支持。
  • 支持 make -j 風格的並行建造。相比 make -j, SCons 可以同時運行 N 個工作,而 不用擔心代碼的層次結構。
  • 使用 Autoconf 風格查找頭文件,函數庫,函數和類型定義。
  • 良好的跨平臺性。Scons 可以運行在 Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和 OS/2 上。

基本要求就上面三點,但有一個建議,爲了上述幾個編譯選項的使用不影響到正常的編譯過程(否則會極大地影響程序的運行效率)。在使用makefile中通過參數傳遞來支持覆蓋率產生,可以在makefile使用下面的方式:

ifeq ($(coverage), yes)
CXXFLAGS       +=  -fprofile-arcs -ftest-coverage
LINKERCXX      +=  -fprofile-arcs -ftest-coverage
OPT_FLAGS     =  -g3
endif

這樣,可以使用 make coverage=yes 來引入這些編譯選項而不會影響到正常的編譯(scons同理)。

覆蓋率產生的過程如下面三個步驟所示:

  1. 編譯鏈接帶覆蓋率參數的源代碼;

  2. 運行測試程序;

  3. 使用gcov獲取文本形式的覆蓋率數據或使用lcov獲取html形式的覆蓋率數據;

可以參考:https://blog.csdn.net/LU_ZHAO/article/details/104517587

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章