为什么 CMake 会忽略源文件?
Why does CMake neglects source files?
不幸的是,我写的 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}) {}
而 "test" 文件是 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.h
和 main.cpp
,但不包括 class.cpp
。如何修改 CMakeList.txt
以获得 class.cpp
的覆盖率统计信息?
我阅读了几份 cmake
和 gcov
文件,我的印象是我特别需要请求覆盖 _SRC
文件。但是,我不知道该怎么做。有人可以指出我能做什么吗?
感谢@squareskitties 的帮助,我设法解决了问题。我只是没有通过所有必需的编译选项。以下 CMakeLists.txt
有效:
c++
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})
SET(CMAKE_CXX_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage")
add_executable(main main.cpp)
target_link_libraries(main StrVec --coverage)
不幸的是,我写的 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}) {}
而 "test" 文件是 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.h
和 main.cpp
,但不包括 class.cpp
。如何修改 CMakeList.txt
以获得 class.cpp
的覆盖率统计信息?
我阅读了几份 cmake
和 gcov
文件,我的印象是我特别需要请求覆盖 _SRC
文件。但是,我不知道该怎么做。有人可以指出我能做什么吗?
感谢@squareskitties 的帮助,我设法解决了问题。我只是没有通过所有必需的编译选项。以下 CMakeLists.txt
有效:
c++
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})
SET(CMAKE_CXX_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage")
add_executable(main main.cpp)
target_link_libraries(main StrVec --coverage)