使用CMake为一个简单的头最小化地构建一个测试



我有一个C++头,它包含一个具有如下方法的类。让我们说它是一个只有标题的库,我有。

// MyHeader.hpp
#pragma once
#include <string>
namespace myheaderonlylibrary {
class MyClass {
public:
unsigned int Func1(const std::string& str) {
if (!str.empty())
return 10;
else
return 0;
}
};
}

为了测试上述方法,我在一个名为unittest的文件夹中创建了以下gtest源文件,这与遵循的约定类似。

// MyTests.cpp
#include <limits.h>
#include "gtest/gtest.h"
#include "../MyHeader.hpp"
TEST(MyTest, Test_Something) {
myheaderonlylibrary::MyClass my_object;
unsigned int expected_value = 0;
EXPECT_EQ(expected_value, my_object.Func1(""));
}

我想做的就是使用Cmake构建测试并运行测试。下面是我的CMakeLists.txt

// CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(MyheaderOnlyLibrary_HEADERS
MyHeader.hpp
)
set(MyheaderOnlyLibrary_unittest
unittest/MyTests.cpp
)
find_package(GTest REQUIRED)
enable_testing ()
add_executable(MyheaderOnlyLibraryTests ${MyheaderOnlyLibrary_unittest})

设置完以上内容后,我执行cmake ..make,结果会出现以下错误。

"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64

问题:
我不是CMake的专业人士。我的问题是,如果我只想运行测试,那么我应该做add_executable吗?当我唯一想要的就是构建和运行测试时,这种方法正确吗?调用make时出现的错误似乎是因为add_executable正在像普通可执行文件中一样查找main方法,但没有找到它

在头文件是唯一要测试的东西的情况下,构建仅测试项目的正确方法是什么?

如何在构建后运行测试?看起来有一个命令CTest来运行使用CMake构建的测试?

环境:
我在macOS上构建它,使用clang作为C++11的编译器。

就像一个普通的C++程序一样,你需要有一个主函数来执行,对于谷歌测试单元测试,你可以使用以下内容:

int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

这将在执行时运行TEST函数。

要使用ctest实际运行测试,您的cmake文件中应该有以下行:

find_package(GTest)
include_directories(${GTEST_INCLUDE_DIRS})
include(CTest)
include(GoogleTest)
enable_testing()
target_link_libraries(testName ${GTEST_LIBRARIES})
gtest_discover_tests(testName)

编辑:在进入cmake之前,作为一个更容易开始的地方,我建议您从命令行编译和运行命令开始。你可以用以下方法做到这一点:

g++ unittest/myunittest.cpp -o unittest/myunittest.out -lgtest -std=c++11
./unittest/myunittest.out

一旦您知道它有效,请查看cmake的文档,并使用cmake文件复制您的结果。然后你就可以开始扩大你的程序了。了解如何通过命令行运行这些命令将使您更好地了解cmake正在做的事情。

最新更新