fro*_*hem 5 c++ cmake catch-unit-test
在Catch2的示例中,我尝试使用cmake项目结构如下运行该示例:
/factorial
+-- CMakeLists.txt
+-- /bin
+-- /include
| +-- catch.hpp
| +-- fact.hpp
+-- /src
| +-- CMakeLists.txt
| +-- fact.cpp
+-- /test
+-- CMakeLists.txt
+-- test_fact.cpp
Run Code Online (Sandbox Code Playgroud)
fact.cpp:
unsigned int factorial( unsigned int number ) {
return number <= 1 ? number : factorial(number-1)*number;
}
Run Code Online (Sandbox Code Playgroud)
fact.hpp:
#ifndef FACT_H
#define FACT_H
unsigned int factorial(unsigned int);
#endif
Run Code Online (Sandbox Code Playgroud)
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 );
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种方法来构建这个项目,cmake但是失败了。有时我会出错:
cpp:X:XX: fatal error: 'fact.hpp' file not found
...
Run Code Online (Sandbox Code Playgroud)
有时我得到:
Undefined symbols for architecture x86_64:
"_main", referenced from:
...
Run Code Online (Sandbox Code Playgroud)
当我跑步时make。
我应该有factorial/CMakeLists.txt,factorial/src/CMakeLists.txt而且factorial/test/CMakeLists.txt,如果我想在我的执行文件factorial/bin?
另外:这是我的CMakeLists.txts(我认为它们是完全错误的)。
factorial/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)
Run Code Online (Sandbox Code Playgroud)
factorial/src/CMakeLists.txt:
project(factorial)
cmake_minimum_required(VERSION 2.8.12)
add_executable(fact fact.cpp)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
如果您查看 CMake 文档,该PROJECT_SOURCE_DIR变量的定义如下:
当前项目的顶级源目录。
这是最近的 project() 命令的源目录。
由于您project多次调用,该变量将不断变化。我建议你删除你的项目指令,或者使用CMAKE_SOURCE_DIR,它总是指向整个项目的源目录。
作为旁注,我建议使用set(CMAKE_CXX_STANDARD 11)而不是add_definition
这里有很多问题:
add_executable(fact fact.cpp)
Run Code Online (Sandbox Code Playgroud)
呼叫应使用add_library(你也可以指定STATIC或SHARED),因为你只定义阶乘函数,不是可执行与main功能。
add_executable(fact fact.cpp)
Run Code Online (Sandbox Code Playgroud)
该文件应该test_fact.cpp和目标应该有不同的名称,以避免与您之前创建的库发生冲突。此外,您fact.cpp不包括fact.hpp. 最后但并非最不重要的,而不是做target_include_directories,只需在您的顶级写以下内容CMakeLists.txt:
include_directories(include)
Run Code Online (Sandbox Code Playgroud)
现在,所有子目录都应该能够访问头文件。请注意,这会删除对头文件(PRIVATEvs PUBLICvs INTERFACE)范围的控制,并允许所有子目录访问头文件。如果您想限制此行为,请target_include_direcories用于所有目标(您的库和测试可执行文件)。对于这个例子,由于一切都需要访问头文件,所以上面的语句是没有问题的。
更多问题:
project(factorial)
cmake_minimum_required(VERSION 2.8.12)
Run Code Online (Sandbox Code Playgroud)
要么切换这些语句的顺序,要么删除它们。(您只需要在顶级 CMake 文件中使用它们)
| 归档时间: |
|
| 查看次数: |
4639 次 |
| 最近记录: |