C++ 如何为C++;w/CMake项目在TravisCI?

C++ 如何为C++;w/CMake项目在TravisCI?,c++,github,code-coverage,travis-ci,static-analysis,C++,Github,Code Coverage,Travis Ci,Static Analysis,我试图用TravisCI在我的GitHub回购协议上配置CodeCov。由于我的回购是在C++中,我已经使用了CGASE,所以我基本上复制了后成功> 标签进入我的 >代码>特拉维斯.YLL> />代码> 文件: after_success: # Creating report - cd ${TRAVIS_BUILD_DIR} - lcov --directory . --capture --output-file coverage.info coverage info - l

我试图用TravisCI在我的GitHub回购协议上配置CodeCov。由于我的回购是在C++中,我已经使用了CGASE,所以我基本上复制了<代码>后成功> <代码>标签进入我的<强> >代码>特拉维斯.YLL> />代码> <强>文件:

after_success:
    # Creating report
  - cd ${TRAVIS_BUILD_DIR}
  - lcov --directory . --capture --output-file coverage.info coverage info
  - lcov --remove coverage.info '/usr/*' --output-file coverage.info 
  - lcov --list coverage.info
  # Uploading report to CodeCov
  - bash <(curl -s https://codecov.io/bash) || echo "Codecov did not collect coverage reports"

问题在于Cmake编译器和链接器标志。为了让GCov(GCC的一部分,由
lcov
)提供分析信息和覆盖率测试,必须设置一些标志

发件人:

具体地说,您需要编译器向目标代码添加分析信息,这是通过向compile命令添加标志
-fprofile arcs
-ftest coverage
来完成的

第一个标志将逻辑添加到目标代码中,以生成通用的分析信息。这是关于每个基本块执行频率的信息。程序运行时,所有这些信息都将保存到扩展名为.da的新文件中,该文件位于.o文件旁边。此文件中的数据不是特定于覆盖范围的,但将由gcov使用

传递给GCC的第二个标志,
-ftest coverage
,也将向对象文件添加逻辑。这一次,目标是输出覆盖范围特定的信息。将生成两个文件,.bb和.bbg。.bb文件是从基本块到行号的简单映射文件。.bbg文件列出了在执行应用程序时运行的相应源文件中的每个弧。gcov使用该数据重建实际程序流程图,从中可以计算所有基本块和弧执行计数

此外,源代码还需要与
-lgcov--coverage
链接。在我的例子中,因为我使用的是Cmake,所以我需要使用
set\u target\u properties
函数指定这些属性:

add_executable(dss-sim dss-sim.cpp)
target_link_libraries(dss-sim
    list
    of
    my
    static
    libs
)
# The libs above also need to be compiled with the same flags.
set_target_properties(dss-sim
    PROPERTIES
    COMPILE_FLAGS "-ftest-coverage -fprofile-arcs"
    LINK_FLAGS    "-lgcov --coverage"
)

最后,由于您通常不希望在覆盖率报告中包含单元测试,因此您将而不是为它们定义编译器标志。但是,请注意,如果您将单元测试与使用gcov选项编译的库相链接,则仍然需要添加链接器标志。

较新版本的GCC只需使用--coverage即可。看见
add_executable(dss-sim dss-sim.cpp)
target_link_libraries(dss-sim
    list
    of
    my
    static
    libs
)
# The libs above also need to be compiled with the same flags.
set_target_properties(dss-sim
    PROPERTIES
    COMPILE_FLAGS "-ftest-coverage -fprofile-arcs"
    LINK_FLAGS    "-lgcov --coverage"
)