본 글의 목적은 개인 정리이므로 100 % 정확한 내용은 아닐 수 있습니다.
CMake 설치
CMake는 Cygwin, Debian, FreeBSD, Mac OS X 등 Unix 기반 OS distribution에는 자동으로 package manager로 설치되어 있을 확률이 높다. Windows는 cmake-gui 설치를 권장하며 source에서 binary installation도 가능하니 cmake 웹사이트를 참고하면 된다.
왜 CMake?
CMake의 매력은 Cross-Compiling을 쉽고 간편하게 하는 데에 있다고 생각한다. 현재에 IT 생태계는 운영체제 Windows, Mac OS, iOS, Android 등 방대하고 Software를 각 운영체제에 맞춰서 설계하는 것은 쉽지 않다. 이를 간편하게 할 수 있는 tool이 CMake이며 library, dependency 를 설정하고 Generator (Windows라면 MSVC (Microsoft Visual Studio), Mac 이라면 XCode)을 설정하면 자동으로 각 운영체제에 맞게 만들어준다.
이때 헷갈리면 안 되는게, CMake는 execution file (실행 파일)을 만들어 주지는 않는다. Execution File을 만들 수 있는 환경을 자동을 세팅해준다고 생각하자.
Ex 1) Windows에서 Visual Studio 를 Generator로 하여 CMake를 사용할 때순서:
- CMakeLists.txt를 읽고 dependency, library, build target을 체크한다. build target은 CMake가 목표로 하는 것이 executable file 인지, library 인지 등의 정보가 담긴다.
- CMake는 앞서 읽은 CMakeLists.txt를 읽고 Visual Studio Solution (.sln) 과 (.vcxproj) 파일을 생성한다. 이 파일들은 Visual Studio가 나중에 어떻게 프로젝트를 생성하는 지에 대한 컴파일러 설정과 경로, 동적 라이브러리 등의 정보를 담고 있다.
- 2번에서 CMake가 Visual Studio Solution 파일을 이미 생성하였고, Solution 파일을 열어서 일반적인 Visual Studio Building 버튼 (화살표 버튼)을 누르면 된다.
Windows 운영체제에만 소프트웨어를 배포한다면 Visual Studio에서만 하면 된다. 하지만 다른 운영체제에도 배포할 시, 언제 dependency, library, build target을 세팅하겠는가? 그 과정을 한 번만 하면 되게 하는게 CMake다!
CMake 기본 명령어 구조
command (args...) 구조를 갖는다.
예를 들어, set (Foo a b c) 는 a b c 라는 string list를 Foo 라는 variable 에 저장한다. 따라서 나중에 변수를 읽어보면
command(${Foo}) -> (변수의 내용을 읽을 때는 ${} 안에 넣으면 된다.) command(a b c) 랑 동일한 내용이다.
CMakeLists.txt의 예시를 보고 이해해보자.
cmake_minimum_required(2.6)
project (HELLO)
set (HELLO_SRCS Hello.c File2.c File3.c)
if (WIN32)
set (HELLO_SRCS ${HELLO_SRCS} WinSupport.c)
else ()
set (HELLO_SRCS ${HELLO_SRCS} UnixSupport.c)
endif ()
add_executable (Hello ${HELLO_SRCS})
# look for the Tcl library
find_library (TCL_LIBRARY
NAMES tcl tcl84 tcl83 tcl82 tcl80
PATHS /usr/lib /usr/local/lib
)
if (TCL_LIBRARY)
target_link_library (Hello ${TCL_LIBRARY})
endif ()
- 상단
cmake_minimum_required(2.6)
project (HELLO)
set (HELLO_SRCS Hello.c File2.c File3.c)
첫 줄은 cmake의 최소 version을 말해준다.
project는 생성될 workspace의 이름을 특정 짓는다.
마지막 줄에 set command는 HELLO_SRCS 라는 variable에 Hello.c File2.c File3.c 를 연결한다.
참고로 CMake는 영어 대문자, 소문자를 구별짓지 않는다.! (최신 용은)
- 중간
if (WIN32)
set (HELLO_SRCS ${HELLO_SRCS} WinSupport.c)
else ()
set (HELLO_SRCS ${HELLO_SRCS} UnixSupport.c)
endif ()
add_executable (Hello ${HELLO_SRCS})
CMake의 Cross-Compile한 성격을 볼 수 있다. Windows 운영체제라면 WinSupport.c 파일을 사용하고 Unix 운영체제라면 UnixSupport.c 파일을 사용해라!
set command를 보면 HELLO_SRCS ${HELLO_SRCS} WinSupport.c 라고 되어 있다. 기존에 HELLO_SRCS variable에 더하라는 뜻이다!
마지막 줄에 add_executable 은 build 과정에서 executable target을 더한다. 여기에 사용되는 파일을 전부 넣으면 된다!
-하단
# look for the Tcl library
find_library (TCL_LIBRARY
NAMES tcl tcl84 tcl83 tcl82 tcl80
PATHS /usr/lib /usr/local/lib
)
if (TCL_LIBRARY)
target_link_library (Hello ${TCL_LIBRARY})
endif ()
find_library command는 다양한 name 과 path 상을 찾으면서 TCL_LIBRARY 변수에 저장한다.
마지막 if 문은 위에서 TCL_LIBRARY를 찾았다면 우리의 project인 Hello 에 linking을 하라는 뜻이다.
CMake 실행 방법
예시를 보는 것이 이해가 빠를 것 같아서 기존에 하던 CMake를 가져왔다. CMake-gui를 사용한다.
현재 CMake cache가 남아 있으므로 처음부터 다시 시작하기 위해 File > Delete Cache 를 누른다.
이 상태에서는 Generator로 아무것도 설정되지 않았으며 Source Code 경로와 Build는 Target Executable이 들어갈 경로만 설정되어 있다. 자율적으로 설정하면 되며, 폴더 이름은 가급적 source, build로 맞추자. 물론 위에서 보여준 CMakeLists.txt는 source 폴더 경로에 있어야 한다.
이 상태에서 configure 버튼을 누르면
화면이 뜬다. 나는 OpenCV라는 라이브러리를 사용할 때 MSVC (Windows Compiler)를 사용하므로 Generator 종류를 바꿔준다.
이후에 CMake가 자동으로 Configure를 진행한다.
빨간 줄이 나왔다고 쫄지 말자. error 뿐만이 아니라 처음보는 내용도 빨간색으로 나온다.
Configure가 성공적으로 마무리 됐다면 Generate 버튼을 눌러서 Visual Studio Solution (.sln) 파일을 생성한다. 이제 Build 파일 경로로 가서 일반적인 Visual Studio IDE를 이용해서 build 하면 된다!
'Computer Science > C++' 카테고리의 다른 글
CMake Shared Lib Linker (0) | 2024.02.26 |
---|---|
VSCode에서 C++ include 설정하기. include error. MSYS64, UCRT, Mingw (0) | 2023.08.29 |
Multithreading Mutex using MSYS2, Ucrt64 (Mingw64) 멀티스레드 (Windows 운영체제, C++) (0) | 2023.08.23 |
멀티 스레드 Multi-thread (+ Windows, MFC) (0) | 2023.08.10 |