在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同理)。
覆蓋率產生的過程如下面三個步驟所示:
-
編譯鏈接帶覆蓋率參數的源代碼;
-
運行測試程序;
-
使用gcov獲取文本形式的覆蓋率數據或使用lcov獲取html形式的覆蓋率數據;
可以參考:https://blog.csdn.net/LU_ZHAO/article/details/104517587