Hello, I am trying to compile a project with multiple source and header files. I am new to CMake. In the main directory, there is main.cc file. All other files including header and source files are stored in a subdirectory src. The class ibvp is similar to TopLevel class in step 18. It is defined in src/ibvp.h and src/ibvp.cc . In the main file, I have added #include "src/ibvp.h". There are 2 CMakeLists.txt, one in the main folder and another in the src folder. The one in the src folder is used to create a library mylib with all the source files. The modified lines in this cmake file are: --- SET(TARGET "mylib")
PROJECT(${TARGET}) SET(CMAKE_BUILD_TYPE Debug) file(GLOB mylib_files *.cc) add_library(mylib ${mylib_files}) DEAL_II_SETUP_TARGET(${TARGET}) --- Both cmake and make are running without error. <${main_directory}/src>$ make -j8 [ 11%] Building CXX object CMakeFiles/mylib.dir/assemble.cc.o [ 22%] Building CXX object CMakeFiles/mylib.dir/boundarycondition.cc.o [ 33%] Building CXX object CMakeFiles/mylib.dir/ibvp.cc.o [ 44%] Building CXX object CMakeFiles/mylib.dir/output.cc.o [ 55%] Building CXX object CMakeFiles/mylib.dir/setup_system.cc.o [ 66%] Building CXX object CMakeFiles/mylib.dir/solve.cc.o [ 77%] Building CXX object CMakeFiles/mylib.dir/utils.cc.o [ 88%] Building CXX object CMakeFiles/mylib.dir/gausspoint.cc.o [100%] Linking CXX static library libmylib.a [100%] Built target mylib After this, I try to compile the main.cc code by linking it with the library mylib in the src folder. The modified lines in this cmake file are: --- SET(TARGET "main") PROJECT(${TARGET}) SET(CMAKE_BUILD_TYPE Debug) INCLUDE_DIRECTORIES(src) add_subdirectory(src) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) DEAL_II_SETUP_TARGET(${TARGET}) target_link_libraries(${TARGET} mylib) --- CMake is not giving any error. But when I run make, I get the following error: <${main_directory}>$ make -j8 Consolidate compiler generated dependencies of target mylib [ 9%] Building CXX object src/CMakeFiles/mylib.dir/assemble.cc.o [ 18%] Building CXX object src/CMakeFiles/mylib.dir/boundarycondition.cc.o [ 27%] Building CXX object src/CMakeFiles/mylib.dir/gausspoint.cc.o [ 36%] Building CXX object src/CMakeFiles/mylib.dir/ibvp.cc.o [ 45%] Building CXX object src/CMakeFiles/mylib.dir/output.cc.o [ 54%] Building CXX object src/CMakeFiles/mylib.dir/setup_system.cc.o [ 63%] Building CXX object src/CMakeFiles/mylib.dir/solve.cc.o [ 72%] Building CXX object src/CMakeFiles/mylib.dir/utils.cc.o [ 81%] Linking CXX static library libmylib.a [ 81%] Built target mylib [ 90%] Building CXX object CMakeFiles/main.dir/main.cc.o [100%] Linking CXX executable main /home/sabyasachi/Documents/current_research/irradiated_materials/irradiated_tension_engg_400C/main.cc:96: error: undefined reference to 'ibvp<3>::ibvp()' /home/sabyasachi/Documents/current_research/irradiated_materials/irradiated_tension_engg_400C/main.cc:98: error: undefined reference to 'ibvp<3>::run()' /home/sabyasachi/Documents/current_research/irradiated_materials/irradiated_tension_engg_400C/main.cc:99: error: undefined reference to 'ibvp<3>::~ibvp()' /home/sabyasachi/Documents/current_research/irradiated_materials/irradiated_tension_engg_400C/main.cc:99: error: undefined reference to 'ibvp<3>::~ibvp()' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/main.dir/build.make:132: main] Error 1 make[1]: *** [CMakeFiles/Makefile2:100: CMakeFiles/main.dir/all] Error 2 make: *** [Makefile:91: all] Error 2 So there are undefined references to the ibvp class constructor, destructor and run function. Please suggest how to resolve this. I have attached all the relevant files with only the relevant lines of code. I would appreciate any help. Thank you. -- The deal.II project is located at http://www.dealii.org/ For mailing list/forum options, see https://groups.google.com/d/forum/dealii?hl=en --- You received this message because you are subscribed to the Google Groups "deal.II User Group" group. To unsubscribe from this group and stop receiving emails from it, send an email to dealii+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/dealii/08c17b44-673a-4aff-8b08-af3f9fb6e87en%40googlegroups.com.
... #include "ibvp.h" //namespace problem //{ using namespace dealii; using namespace std; #ifndef IBVP_CC #define IBVP_CC template <int dim> ibvp<dim>::ibvp() : (all initialization) { ... } template <int dim> ibvp<dim>::~ibvp() { ... } template <int dim> void ibvp<dim>::run() { ... } #endif //}
... #include "src/ibvp.h" //#include "src/utils.h" int main(int argc, char **argv) { try { using namespace dealii; Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1); std::cout<<"\n Starting..."; ibvp<3> irradiation; std::cout<<"\n Object created..."; irradiation.run(); } ... }
## # CMake script for the initial boundary value problem: ## # (cmake and deal ii requirement checks - from CMakeLists.txt of Step 18) # changes made my me SET(TARGET "mylib") PROJECT(${TARGET}) SET(CMAKE_BUILD_TYPE Debug) file(GLOB mylib_files *.cc) add_library(mylib ${mylib_files}) DEAL_II_SETUP_TARGET(${TARGET})
## # CMake script for the initial boundary value problem: ## # (cmake and deal ii requirement checks - from CMakeLists.txt of Step 18) DEAL_II_INITIALIZE_CACHED_VARIABLES() #changes made by me SET(TARGET "main") PROJECT(${TARGET}) SET(CMAKE_BUILD_TYPE Debug) INCLUDE_DIRECTORIES(src) add_subdirectory(src) # Set the name of the project and target: ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) DEAL_II_SETUP_TARGET(${TARGET}) target_link_libraries(${TARGET} mylib)
... ... #ifndef IBVP_H #define IBVP_H template <int dim> class ibvp { public: ibvp(); ~ibvp(); void run(); //Tensor<4, dim> get_stress_strain_tensor_lagrangian() {return stress_strain_tensor_lagrangian;}; (all function definitions e.g. setup system, assemble, solve, output etc.) ... //double km_prefactor; }; #endif //}