为什么CMake忽略源文件?

时间:2019-08-02 16:52:22

标签: c++ cmake compilation code-coverage gcov

不幸的是,我编写的CMakeLists.txt文件只为头文件和测试脚本创建覆盖率统计信息,而没有为源文件创建覆盖率统计信息。但是,我想了解源文件的覆盖率信息。我在做什么错了?

作为示例,下面是头文件:class.h

#include <string>
#include <vector>
#include <iostream>
class StrVec{
    public:
    StrVec(const std::string&);
    void print() {std::cout << vec[0] << std::endl;}

    private:
    std::vector<std::string> vec;
};

源文件为class.cpp

#include "class.h"

StrVec::StrVec(const std::string& s): vec({s}) {}


“测试”文件为main.cpp

#include "class.h"

int main() {
    std::string s("test");
    StrVec str_vec(s);
    str_vec.print();
}

我写的CmakeLists.txt文件是:

cmake_minimum_required (VERSION 3.5)

project (StrVec)
set(LIBRARY_TARGET_NAME ${PROJECT_NAME})
SET (CMAKE_CXX_COMPILER             "/usr/bin/g++")

set(${LIBRARY_TARGET_NAME}_SRC
    class.cpp
)

set(${LIBRARY_TARGET_NAME}_HDR
    class.h
)

add_library(${LIBRARY_TARGET_NAME} SHARED ${${LIBRARY_TARGET_NAME}_SRC})
add_compile_options(--coverage -O0)

add_executable(main main.cpp)
target_link_libraries(main StrVec --coverage)

当我编译代码并运行程序时,lcov仅找到main.cpp.gcda而不是class.cpp。因此,覆盖范围统计信息仅包括头文件class.hmain.cpp,但不包括{em> class.cpp。如何修改CMakeList.txt以获得class.cpp的覆盖率统计信息?

我阅读了几份cmakegcov文档,给人的印象是,我特别需要请求_SRC文件的覆盖范围。但是,我不知道该怎么做。有人可以指出我可以做什么吗?

1 个答案:

答案 0 :(得分:1)

感谢@squareskitties的帮助,我设法解决了这个问题。我只是没有通过所有必需的编译选项。以下let numb = ["84.0711 billion", "$52.6138 billion", "$43.55 billion", "$54.73 million"] const res = [] for (let i = 0; i < numb.length; i++) { res.push(convertNumber(numb[i])) } console.log(JSON.stringify(res)); //wanted output: ["84071100000", "52613800000", "43550000000", "54730000"] function convertNumber(numb) { var digits = numb .match(/\d+(?:\.\d+)/g) .map(Number)[0]; if (numb.includes('billion')) digits *= 1000000000 if (numb.includes('million')) digits *= 1000000 return digits }起作用了:

CMakeLists.txt