使用 CMake 为简单的 header 极简地构建测试

Minimalistically building a test for a simple header using CMake

我有一个 C++ header,其中包含一个 class,其方法如下所示。假设它是我拥有的 header 唯一的图书馆。

// 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;
    }
};

}

为了测试上述方法,我将以下 gtest 源文件放在名为 unittest 的文件夹中,这就像遵循的约定。

// 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 方法,就像在普通可执行文件中一样,但没有找到它。

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

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

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

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

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 正在做什么。