gpt4 book ai didi

使用 Catch 的 C++ 测试类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:02 24 4
gpt4 key购买 nike

我决定做一个小项目,我会尽可能多地进行测试。我正在使用 CLion(使用 CMake)和 Catch 库进行测试。

问题是我在运行测试类时得到了 对 TestClass::add 方法的 undefined reference

这是我的设置(这是一个虚拟设置,因为我想确定是否一切正常):

TestClass.h

#ifndef LLL_TESTCLASS_H
#define LLL_TESTCLASS_H

class TestClass {
public:
int add(int a, int b);
};

#endif //LLL_TESTCLASS_H

TestClass.cpp

#include "TestClass.h"
int TestClass::add(int a, int b) {
return a + b;
}

test.cpp -- 测试文件

#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "../src/TestClass.h"

TEST_CASE("addition") {
TestClass testClass;
REQUIRE(testClass.add(2,3) == 5);
REQUIRE(testClass.add(-1, 1) == 0);
REQUIRE(testClass.add(2, 4) == 1);
}

CMakeLIsts.txt

cmake_minimum_required(VERSION 3.2)
project(LLL)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(LIB_DIR "lib")
include_directories(${LIB_DIR}/Catch)
include_directories(${LIB_DIR}/Eigen)

set(SRC_DIR src)
set(SOURCE_FILES ${SRC_DIR}/main.cpp src/TestClass.h src/TestClass.cpp)
add_executable(LLL ${SOURCE_FILES})

set(TEST_DIR test)
set(TEST_FILES ${TEST_DIR}/test.cpp)
add_executable(LLL_TEST ${TEST_FILES})

最佳答案

您没有指定要在 LLL_TEST 可执行目标中编译的 TestClass.{.h, .cpp}:

set(TEST_FILES src/TestClass.h src/TestClass.cpp ${TEST_DIR}/test.cpp)

或者最好将它移动到某个共享库中并直接链接到它。

问题是因为您的项目产生了 2 个可执行文件:LLLLLL_TEST 目标。他们每个人都有一个目标文件和一个引用。在 LLL 目标中,这些对 TestClass 的引用是满足的,因为它们是在 LLL 目标中编译的,因此 ld 可以简单地链接他们。但是在 LLL_TEST 目标编译器找不到这些符号的情况下,因为它们未在此目标中指定 - 这就是编译器说他无法解析引用的原因。

关于使用 Catch 的 C++ 测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com