CMake - 2 (Modularization)
1. CMakeLists를 이용해서 파일을 모듈화 시키는 방법
이번에는 파일을 모듈화 시키는 방법에 대해서 알아보자. 이전 페이지에서 main.cpp와 source1.cpp가 동일한 경로에 존재했다. 그러나, 실제 개발환경을 구성하다 보면, 라이브러리 파일 등을 별도로 관리하는 경우가 많다. 모듈화를 어떻게 할 수 있는지 예제를 통해 확인해 보자.
1.1 예제 1) 모듈화 예제
main 문에서 Hello World를 출력하는 코드를 작성하였고, 이를 실행파일로 만들고자 한다. header1.h
, header.2
파일이 따로 모듈화 되어 있다고 생각해보자.
main.cpp
1 2 3 4 5 6 7 8 #include <iostream> #include "header1.h" #include "header2.h" void main(int argc, char* argv[]) { std::cout << "main call" << std::endl; source1_function(); // header1.h, source1.cpp 필요 source2_function(); // header2.h, source2.cpp 필요 }
전체 코드 트리는 아래와 같다.
code tree
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 my_project/ ├── app/ | |── main.cpp | |── CMakeLists.txt -- "app CMakeLists" ├── build/ ├── LibraryFile_1/ | ├── lib_1/ | ├── include/ | └── header1.h | ├── src/ | └── source1.cpp | └── CMakeLists.txt -- "lib_1 CMakeLists" | └── CMakeLists.txt -- "LibraryFile_1 CmakeLists" ├── LibraryFile_2/ | ├── lib_2/ | ├── include/ | └── header2.h | ├── src/ | └── source2.cpp | └── CMakeLists.txt -- "lib_2 CMakeLists" | └── CMakeLists.txt -- "LibraryFile_2 CmakeLists" └── CMakeLists.txt -- "my_project CmakeLists"
위 프로젝트를 이루고 있는 CMakeLists에 대해서 하나씩 알아보자.
my_project CMakelists에서는 set을 이용하여 각 파일에 대한 이름을 지정하고, subdirectory를 추가한다.
CMakeLists (my_project)
1 2 3 4 5 6 7 8 9 10 11 cmake_minimum_required(VERSION 3.0.0) project(IntegrationTemplate VERSION 1.0.0 LANGUAGES C CXX) set(EXECUTABLE_NAME Executable) # 실행 파일 이름 지정 set(LIBRARY_NAME1 Library1) # LibraryFile_1에 대한 이름 지정 set(LIBRARY_NAME2 Library2) # LibraryFile_2에 대한 이름 지정 add_subdirectory(LibraryFile_1) add_subdirectory(LibraryFile_2) add_subdirectory(app)
app CMakeLists는 다음과 같다. app 폴더 내에는 main.cpp가 존재한다. 이 main.cpp에 Library1
, Library2
파일을 링킹해야 한다.
CMakeLists (app CMakeLists)
1 2 3 add_executable(${EXECUTABLE_NAME} "main.cpp") target_link_libraries(${EXECUTABLE_NAME} PUBLIC ${LIBRARY_NAME1}) target_link_libraries(${EXECUTABLE_NAME} PUBLIC ${LIBRARY_NAME2})
lib_1 CMakeLists는 다음과 같다. lib_1
에 대한 소스파일과 헤더파일을 include해야 한다.
CMakeLists (app lib_1)
1 2 add_library(${LIBRARY_NAME1} STATIC src/source1.cpp) target_include_directories(${LIBRARY_NAME1} PUBLIC include)
LibraryFile_1 CMakeLists는 다음과 같다. lib_1
에 대해 directory를 추가해야 한다.
CMakeLists (app LibraryFile_1)
1 add_subdirectory(lib_1)
lib_2 CMakeLists는 다음과 같다. lib_2
에 대한 소스파일과 헤더파일을 include해야 한다.
CMakeLists (app lib_1)
1 2 add_library(${LIBRARY_NAME2} STATIC src/source2.cpp) target_include_directories(${LIBRARY_NAME2} PUBLIC include)
LibraryFile_1 CMakeLists는 다음과 같다. lib_2
에 대해 directory를 추가해야 한다.
CMakeLists (app LibraryFile_2)
1 add_subdirectory(lib_2)