【问题标题】:Minimalistically building a test for a simple header using CMake使用 CMake 极简地为简单的标头构建测试
【发布时间】:2020-12-06 17:54:33
【问题描述】:

我有一个 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;
    }
};

}

为了测试上述方法,我将以下 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 方法,就像在普通可执行文件中一样,它没有找到它。

构建一个只需要测试头文件的项目的正确方法是什么?

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

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

【问题讨论】:

    标签: c++ cmake gnu-make googletest


    【解决方案1】:

    就像一个普通的 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 正在做什么。

    【讨论】:

    • 是的,您可以像普通应用程序一样运行它,也可以使用 ctest 命令来避免
    • 是的,您需要链接 googletest 库,cmake 可以使用我在编辑中添加的行来处理这个问题,您可能需要使用更高版本的 cmake 才能访问 gtest_discover_tests 函数
    • 是的,这只是您实际测试名称的占位符,MyHeaderOnlyLibraryTest
    • 代替 gtest_discover_tests() 尝试 gtest_add_tests()。那是discover tests pre-version 3.10的前身。或者,请先查看我在命令行中构建的编辑
    • 很高兴能帮上忙!
    猜你喜欢
    • 2011-08-01
    • 2018-12-28
    • 1970-01-01
    • 2022-10-20
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多