gpt4 book ai didi

c++ - 如何将 CMake 与 Catch2 一起使用?

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

来自 Catch2's example , 我试着用 cmake 运行这个例子,我的项目结构是这样的:

/factorial
+-- CMakeLists.txt
+-- /bin
+-- /include
| +-- catch.hpp
| +-- fact.hpp
+-- /src
| +-- CMakeLists.txt
| +-- fact.cpp
+-- /test
+-- CMakeLists.txt
+-- test_fact.cpp

fact.cpp:

unsigned int factorial( unsigned int number ) {
return number <= 1 ? number : factorial(number-1)*number;
}

fact.hpp:

#ifndef FACT_H
#define FACT_H

unsigned int factorial(unsigned int);

#endif

test_fact.cpp:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "fact.hpp"

TEST_CASE( "factorials are computed", "[factorial]" ) {
REQUIRE( factorial(1) == 1 );
REQUIRE( factorial(2) == 2 );
REQUIRE( factorial(3) == 6 );
REQUIRE( factorial(10) == 3628800 );
}

我已经尝试了几种方法来使用 cmake 构建这个项目,但都失败了。有时我得到一个错误:

cpp:X:XX: fatal error: 'fact.hpp' file not found
...

有时我得到:

Undefined symbols for architecture x86_64:
"_main", referenced from:
...

当我运行 make 时。

factorial/CMakeLists.txtfactorial/src/CMakeLists.txtfactorial/test/CMakeLists.txt 应该有什么,如果我想在 factorial/bin 中有我的执行文件?

附加:这是我的 CMakeLists.txts(我认为它们完全错误)。

阶乘/CMakeLists.txt:

project(factorial)
cmake_minimum_required(VERSION 2.8.12)

add_definitions("-std=c++11")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

add_subdirectory(src)
add_subdirectory(test)

factorial/src/CMakeLists.txt:

project(factorial)
cmake_minimum_required(VERSION 2.8.12)

add_executable(fact fact.cpp)

factorial/test/CMakeLists.txt:

project(factorial)
cmake_minimum_required(VERSION 2.8.12)

add_executable(test_fact test_fact.cpp)
target_include_directories(test_fact PRIVATE ${CMAKE_SOURCE_DIR}/include)

最佳答案

这里有很多问题:

add_executable(fact fact.cpp)

调用应该使用 add_library(您也可以指定 STATICSHARED),因为您只定义了一个阶乘函数,而不是具有 main 功能的可执行文件

add_executable(fact fact.cpp)

该文件应为 test_fact.cpp 并且目标应具有不同的名称以避免与您之前创建的库发生冲突。此外,您的 fact.cpp 不包含 fact.hpp。最后但同样重要的是,不要执行 target_include_directories,只需在您的顶级 CMakeLists.txt 中写入以下内容:

include_directories(include)

现在,所有子目录都应该能够访问头文件。请注意,这会移除对头文件范围的控制(PRIVATE vs PUBLIC vs INTERFACE)并允许所有子目录访问头文件。如果您想限制此行为,请对所有目标(您的库和测试可执行文件)使用 target_include_direcories。对于这个例子,由于一切都需要访问头文件,所以上面的语句没有问题。

更多问题:

project(factorial)
cmake_minimum_required(VERSION 2.8.12)

要么调换这些语句的顺序,要么同时删除它们。 (您只需要在顶级 CMake 文件中使用它们)

关于c++ - 如何将 CMake 与 Catch2 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49413898/

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