From Catch2's example, I tried to run this example with cmake
where structure of my project is like this:
/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 );
}
I tried several ways already to build this project with cmake
but it's failed. Sometimes I got an error:
cpp:X:XX: fatal error: 'fact.hpp' file not found
...
and sometimes I got:
Undefined symbols for architecture x86_64:
"_main", referenced from:
...
when I run make
.
What should I have in factorial/CMakeLists.txt
,factorial/src/CMakeLists.txt
and factorial/test/CMakeLists.txt
, if I want to have my execution files in factorial/bin
?
Additional: This is my CMakeLists.txts (I think they are completely wrong).
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)
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)
If you look at the CMake documentation, the PROJECT_SOURCE_DIR
variable is define as that:
Top level source directory for the current project.
This is the source directory of the most recent project() command.
Since you called project
many times, that variable will constantly change. I would suggest you to remove your project directive, or to use CMAKE_SOURCE_DIR
, which always point to the source directory of the whole project.
As a side note, I suggest to use set(CMAKE_CXX_STANDARD 11)
instead of add_definition