Reputation: 395
I am trying to build a test project with a "submodule/subproject".
The compilation fails with:
example_01/src/main.cpp:2:10: fatal error: inc/foo2.hpp: No such file or directory
#include "inc/foo2.hpp" // #include "submodule/inc/foo2.hpp"
^~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/hello_world.dir/build.make:63: CMakeFiles/hello_world.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/hello_world.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
My files:
cmake_minimum_required(VERSION 3.12)
project(hello_world)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
include_directories(${PROJECT_SOURCE_DIR})
add_subdirectory("submodule")
add_executable(${PROJECT_NAME}
src/main.cpp
src/foo.cpp)
#include "inc/foo.hpp"
#include "inc/foo2.hpp" // #include "submodule/inc/foo2.hpp"
int main()
{
foo();
foo2();
return 0;
}
#include <iostream>
#include "inc/foo.hpp"
void foo()
{
std::cout << "Hello World!\n";
}
void foo();
project(submodule_dummy1)
add_executable(${PROJECT_NAME} src/foo2.cpp)
#include <iostream>
#include "inc/foo2.hpp"
void foo2()
{
std::cout << "FuuTwo\n";
}
void foo2();
Is there something else I need to declare so it can "see" the submodule header?
.
├── build
├── CMakeLists.txt
├── inc
│ └── foo.hpp
├── readme.md
├── src
│ ├── foo.cpp
│ └── main.cpp
└── submodule
├── CMakeLists.txt
├── inc
│ └── foo2.hpp
└── src
└── foo2.cpp
cmake_minimum_required(VERSION 3.12)
project(hello_world)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/submodule)
add_subdirectory("submodule")
add_executable(${PROJECT_NAME}
src/main.cpp
src/foo.cpp)
Scanning dependencies of target hello_world
[ 20%] Building CXX object CMakeFiles/hello_world.dir/src/main.cpp.o
[ 40%] Linking CXX executable hello_world
/usr/bin/ld: CMakeFiles/hello_world.dir/src/main.cpp.o: in function `main':
main.cpp:(.text+0xa): undefined reference to `foo2()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/hello_world.dir/build.make:99: hello_world] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/hello_world.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
Upvotes: 1
Views: 24350
Reputation: 18950
You are missing a
include_directories(${PROJECT_SOURCE_DIR}/submodule)
in the main CMakeLists.txt.
Also you need to compile and link submodule/src/foo2.cpp
(by adding it as argument to the add_executable
command in your main CMakeLists.txt.
Upvotes: 1