Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;用Catch测试类_C++_Testing_Cmake_Clion - Fatal编程技术网

C++ C++;用Catch测试类

C++ C++;用Catch测试类,c++,testing,cmake,clion,C++,Testing,Cmake,Clion,我决定做一个小项目,我将尽可能多地进行测试。我正在使用CLion(使用CMake)和Catch库进行测试 问题是,在运行测试类时,我得到了对TestClass::add方法的未定义引用 这是我的设置(这是一个虚拟设置,因为我想确保一切正常): TestClass.h #ifndef LLL_TESTCLASS_H #define LLL_TESTCLASS_H class TestClass { public: int add(int a, int b); }; #endif //L

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

问题是,在运行测试类时,我得到了对TestClass::add方法的
未定义引用

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

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)
或者最好将它移动到某个共享库中,并链接到它


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

Polevoy已经回答了您的问题,他也正确地将类分解到库中

我只想展示一下库版本的样子。您可以决定它是否真的如此复杂,您需要阅读书籍,或者它是否有做TDD的开销

cmake_minimum_required(VERSION 3.2)
project(LLL)

set(CMAKE_CXX_STANDARD 11) # adds -std=c++11
set(CMAKE_CXX_STANDARD_REQUIRED ON)

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

add_library(LLL_LIB src/TestClass.h src/TestClass.cpp)

add_executable(LLL src/main.cpp)
target_link_libraries(LLL LLL_LIB)

add_executable(LLL_TEST test/test.cpp)
target_link_libraries(LLL_TEST LLL_LIB)
此脚本创建链接到两个可执行文件的静态库
LLL_LIB
。如果愿意,您可以构建一个共享的:

add_library(LLL_LIB SHARED src/TestClass.h src/TestClass.cpp)

但是静态在这里很好。

谢谢,这很有效……但是你能给我解释一下这一部分吗:“或者最好将它移动到某个共享库中并链接到它”?我是一个全新的C++,并构建系统的东西,使用java和Python库,安装和使用起来相当容易,所以我有点迷惑:/@ SvenVidak如果它帮助你-接受它作为答案,这样其他有麻烦的人可能知道解决方案。关于一个图书馆——它需要大量的文本,也需要很多时间去理解。我建议你读一本关于
C
C++
的好书。但在我看来,这些库只在一些unix/linux书籍中得到了很好的解释,我还需要再等2分钟才能接受答案。关于共享LIB——我对它们有一些了解,但据我所知,每次我想测试一些东西时,我都必须重新创建它们,如果我想做TDD之类的事情,那真的很烦人。我说得对吗?如果你这样做的话,TDD
-是的。当然,您应该考虑项目的架构并对其进行优化。我想澄清一下,是的,每次您更改某些内容并想要对其进行测试时,您都需要重新创建库,但如果您按照tamas中的方式进行设置。kenez的回答是,该过程一点也不令人厌倦,只是作为常规重建,不管怎样,您都必须像在java中一样执行这些操作。