본문 바로가기

C++/CMake

CMake command 정리

  1. cmake_minimum_required
    => 프로젝트에 대한 cmake 의 최소 버전을 명시
    => ex) cmake_minimum_required(VERSION 3.1)

  2. project
    => 프로젝트의 이름을 설정
    => 버전 관리도 할 수 있음
    => 하지만, 프로그램 언어 정도만 기술하는게 편해보임
    => ex) project(myproject C CXX)
    => CXX == C++

  3. set 
    => 사용 할 값에 대한 변수명을 명시
    => set(변수명 값) 
    => ex) set(CMAKE_BUILD_TYPE Release)

  4. message
    => 콘솔 화면에 로그를 기록
    => message(Mode messages...)
    => mode 는 주로 STATUS, FATAL_ERROR, DEBUG, TRACE 사용해도 충분해 보임
    => FATAL_ERROR 로 출력할 경우 cmake 빌드를 중단 함
    => ex) message(STATUS "Hello " "world")
    => 메시지가 여러 개 일 경우 메시지를 concat 해서 출력 함

  5. list
    => Reading, Search, Modification, Ordering 같은 명령어를 사용
    => https://cmake.org/cmake/help/latest/command/list.html
    => ex) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
    => CMAKE_MODULE_PATH 라는 list 에 값을 추가 함

  6. find_package
    => 현재 프로젝트가 참조해야 하는 외부 라이브러리 package 를 찾는다.
    => 보통, Find<package_name>.cmake 파일을 이용하여 찾음.
    => ex) boost 를 찾고자 하는 경우 FindBoost.cmake 파일을 이용하여 찾음.
              cmake 설치 시, 대부분의 Find cmake 파일이 이미 내장되어 있음
              없는 경우, list(APPEND CMAKE_MODULE_PATH ...) 를 이용하여
             해당 패키지에 대한 find cmake 파일 경로를 추가해야 함
    => ex) find_package(Boost <version> <REQUIRED> <COMPONENTS>)
              boost 의 경우 버전도 다양하고 제공하는 라이브러리도 많기 때문에,
              특정 버전/ 특정 컴포넌트만 찾도록 명시 할 수 있다.
    => REQUIRED 가 명시되어 있을 때, package 를 찾지 못하면 cmake 빌드는 중단된다.
    => package 를 찾은 경우 해당 package 의 include 경로와 library 경로를 알 수 있다.
         boost 의 경우
        ${Boost_INCLUDE_DIRS} 와 ${Boost_FILESYSTEM_LIBRARY} 등이다.
        include 경로와 library 경로를 의미하는 변수는 인터넷이나 find cmake 파일 내에서 찾을 수 있다.

  7. include_directories
    => 컴파일러가 include file 을 찾을 경로를 명시한다.
    => 상대경로는 현재 소스 경로를 기준으로 한다. (CMakeLists.txt 가 위치하는 경로)
    => ex) include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
              AFTER: appending
              BEFORE: prepending
              SYSTEM: 일부 플랫폼에서 system include directory 로 취급하도록 알림

  8. add_definitions
    => 소스코드 컴파일 시 사용 할 매크로 값을 설정 (gcc -D 옵션)
    => ex) add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)

  9. add_executable
    => 명시한 소스코드를 실행 파일 형태로 빌드할 것을 명시
    => ex) add_executable(<name> source)
    => add_executable 에서 명시한 <name> 을 기준으로 이후 해당 빌드에 대한 여러 옵션을 추가 할 수 있다.

  10. add_library
    => 명시한 소스코드를 라이브러리 형태로 빌드할 것을 명시
    => ex) add_library(<name> [STATIC | SHARED | MODULE] sources...)
              <name> 을 통해 차후 컴파일 시 [리눅스: lib<name>.a] / [윈도우: <name>.lib] 형태로 출력물이 생성 된다. 

  11. target_link_libraries
    => 명시한 라이브러리를 target 빌드 시 링킹 하도록 한다.
    => ex) target_link_libraries(<target> item1 item2 ...)
            <target> 에는 add_executable 및 add_library 에서 명시한 <name> 을 사용해야 한다.
            item 에는 library 경로를 명시해야 한다. 
            /usr/lib/abc.a 와 같은 절대 경로 혹은 cmake 가 library 디렉터리 경로를 알고 있는 경우 ws2_32.lib 와 같이
           라이브러리 이름만 명시하면 된다.
    => Module 간 의존성이 존재 할 경우 순서에 유의 해야한다.
    => ex) Module_A 가 Module_B 에 의존하며 AppC 가 Module B 와 Module A 를 링킹해야 하는 경우
               target_link_libraries(AppC Module_B Module_A)
       # 의존이 많이 걸리지 않는 모듈이 가급적 앞에 와야 한다.

  12. target_precompile_headers
    => CMake 3.16 버전부터 지원
    => 미리 컴파일 된 헤더 빌드를 지원
    => add_library 또는 add_executable 로 지정 된 target 에 대해서 사용이 가능하다.
    => 

  13. set_target_properties
    => add_library 나 add_executable 인 target 을 대상으로 설정 가능. (복수 개 가능)
    => ex) target mySimple 을 32bit 로 컴파일 한다. (리눅스 gcc 혹은 g++ 기준)
        set_target_properties(mySimple PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 
        set_target_properties(mySimple1 mySimple2 PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

 

 

 

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

CMake command 정리 2  (0) 2023.06.07
리눅스 CMake 설치  (0) 2023.01.04