Program/C & C++

[CMake] 초심자를 위한 예제

너구리V 2013. 6. 10. 16:41
$ ls
DBMaker.h   TableTree   DBMaker.cpp   Utility   main.cpp
(directory TableTree: TableTree.h, TableTree.cpp 포함.)
(directory Utility: util.h, util.cpp 함유.)

$ vim main.cpp
#include <표준적인것들>
#include "util.h"
#include "DBMaker.h"
...

$ vim DBMaker.h
#include <아무거나>
#include "util.h"
#include "TableTree.h"
...

$ vim TableTree/TableTree.h
#include <이것저것>
...   // TableTree.h 는 별다른 dependency가 없다.

$ vim Utility/util.h
#include <와구와구>
...   // util.h 또한 사용자 정의 헤더파일을 포함하지 않는다.

$ vim CMakeLists.txt  (아래 내용은 CMakeLists.txt 파일에 들어가야 할 내용들)
cmake_minimum_required (VERSION 2.8)  # 필수 정보

project (DBManager)  # 필수 정보

include_directories ("${PROJECT_SOURCE_DIR}/Utility" "${PROJECT_SOURCE_DIR}/TableTree") # to find header files
#add_subdirectory (Utility)  # if this directory has CMakeLists.txt file.
#add_subdirectory (TableTree) 
add_library (Utility SHARED "${PROJECT_SOURCE_DIR}/Utility/util.cpp")  # (생성할 라이브러리 이름, [속성], 파일명 또는 경로)
add_library (TableTree SHARED "TableTree/TableTree.cpp")  # this type of path name is also possible.
add_library (DBMaker SHARED DBMaker.cpp)
target_link_libraries (DBMaker Utility TableTree)  # (DBMaker는 Utility 라이브러리와 TableTree 라이브러리를 include한다..)

add_executable (dbm main.cpp)  # (생성할 실행파일 이름, 파일명)
target_link_libraries (dbm DBMaker Utility)



감각이 있는 분들이라면 아시겠지만 #은 주석 기호.
필수 정보라 표시해둔 것들은 cmake 홈페이지에 튜토리얼 첫 번째 예제에서도 언급되는 것들이다.

제일 처음 두 개의 필수정보를 채워넣은 뒤 필요한 것은 add_executable () 또는 add_library ().
add_library () 만 넣어준다면
$ cmake .
$ make
를 실행해 줬을 때 라이브러리 파일 하나가 생성될 것이다.
물론 add_executable () 을 넣어주면 똑같은 과정을 밟았을 때 실행파일이 생성된다.

dependency가 있을 경우 target_link_libraries 커맨드를 사용한다.
이 커맨드의 첫 번째 argument는 뒤의 모든 argument들을 include하는 관계임을 알 수 있다.
이때, add_library() 나 add_executable() 을 통해 연관된 라이브러리나 실행파일을 모두 생성한 뒤 target_link_libraries()를 써줘야 한다.
(target_link_libraries 문법: 여기서부턴 위 링크된 메뉴얼에서 Ctrl+F 해서 찾아보세요ㅋ)

add_subdirectory는 주석해놨는데.. 저 상태에서 봉인 해제해봤자 동작하지 않을 거다.
해당 directory가 별도로 빌드될 수 있는 모듈인 경우 그 directory에도 CMakeLists.txt 파일을 만들어주고
(이 파일에서도 project(DBManager) 로 프로젝트 이름은 같게 설정한다.)
상위 directory의 CMakeLists.txt 파일(즉, 지금 보여주는 예제 파일)에서 add_subdirectory를 통해 하위 모듈을 포함함을 명시해줘야 한다.

마지막으로 변수(Variable)
변수는 같은 프로젝트 내에선 공유됨.
하위 모듈에서도 ${PROJECT_SOURCE_DIRECTORY}는 같은 값을 가지더라.
변수 목록 역시 Cmake 공식 문서에서 알 수 있고 클릭하면 설명도 볼 수 있다.

더 상세한 설정을 원하면 공식 문서를 뒤져봐야 하는데, 일단 가닥이 잡히니 좀 더 쉽겠지 싶다.


반응형

'Program > C & C++' 카테고리의 다른 글

CMAKE + GCOV + LCOV 사용  (0) 2014.02.27
구글 프로토콜 버퍼 (Google Protocl Buffer)  (0) 2013.06.10
CMake 정의/개념  (0) 2013.06.10
C++ PostgreSQL Example  (0) 2013.06.10
[boost] boost 동기화 객체 boost::shared_mutex  (0) 2013.03.28