[C++] CMake로 프로젝트 빌드하기

zzwon1212·2023년 10월 20일

무제

목록 보기
2/7

1. CMake란?

  • 개요
    • 크로스 플랫폼 지원
    • 빌드 자동화, 테스트, 소프트웨어 패키징 및 설치 도구
    • 컴파일러에 독립적
    • 빌드 파일을 생성(빌드 시스템이 아님)
    • 디렉토리 구조와, 여러 라이브러리에 의존하는 응용 프로그램을 지원
  • CMake 빌드 2단계
    • ① Generate
      • CMakeLists.txt 파일을 분석하여 C++ 프로젝트의 구조 파악
      • 빌드를 위한 컴파일러와 빌드 시스템 확인
      • 모든 소스코드 및 종속성 확인
    • ② Build
      • 세팅한 빌드 시스템에 맞추어 빌드 커맨드를 생성

2. 내가 이해한 대로 빌드해보기

2.1. 디렉토리 구조

  • hello_cmake
    • CMakeLists.txt

      cmake_minimum_required(VERSION 3.10)
      
      set(PACKAGE_NAME HELLO_CMAKE)
      
      project(${PACKAGE_NAME} LANGUAGES CXX)
      
      set(CMAKE_CXX_STANDARD 14)
      set(CMAKE_CXX_STANDARD_REQUIRED ON)
      
      add_executable(${PACKAGE_NAME}_MAIN ./main.cpp)
    • build: empty directory

    • main.cpp

      #include <iostream>
      
      int main() {
          std::cout << "Hello, World!" << std::endl;
          return 0;
      }

2.1. 터미널에서 빌드

  • CMake 설치
    $ sudo apt install -y cmake

  • 프로젝트 디렉토리 구조를 확인한다.

  • build 폴더로 이동한다.

  • build 폴더가 비어있다.

  • generate 단계: 빌드를 위한 환경설정

    $ cmake -DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_INSTALL_PREFIX=../install ../opencv/

    • -DCMAKE_BUILD_TYPE: debug와 release 옵션 설정
    • -GNinja: build system(=generator) 설정
      • MAKE는 UNIX의 기본 빌드 시스템
      • Ninja는 빌드 프로세스를 효율적으로 실행하고, 빌드 시간을 최소화
    • -DCMAKE_INSTALL_PREFIX: 로컬 파일 설치를 위한 경로 지정(install 저장 위치 설정)
      • 기본 위치는 /usr/local/include/, /usr/local/lib/
      • 저장 위치 변경하여 라이브러리 충돌을 방지
    • ../opencv/: 최상위 CMakeLists.txt가 위치한 디렉토리
  • build 폴더에 파일들이 생성됐다.

  • $ make -j7: CPU 코어 7개를 사용하여 프로젝트를 빌드한다.
  • build 폴더에 실행 파일(HELLO_CMAKE_MAIN)이 생성됐다.
  • 실행 파일을 실행한다.
  • "인사 잘~한다"
  • Thirdparty build 후 예시(OpenCV) 참고
    • build/Makefile
      Make 빌드 시스템이 사용할 수 있는 커맨드를 모아둠
    • 빌드 후 라이브러리
    • C++ 프로그램에 OpenCV를 링크할 수 있도록 하는 필요한 모든 파일들을 /install 디렉토리에 넣기
      $ sudo make install

2.2. VS Code에서 빌드

  • ① build 폴더가 비어있다.
  • ②, ③ 빌드 타입을 'Debug'로 설정한다.
    • Debug: 디버그 최적화
    • Release: 속도 최적화, 배포에 사용
  • <CTRL+SHIFT+P> 키보드 입력 후 'CMake: Select a Kit'을 입력한다.
  • ⑤ 컴파일러를 설정한다. 나는 Clang 6.0.0으로 설정했다.
  • ⑥ 빌드한다.
  • ⑦ 빌드 완료.
  • ⑧ build 폴더에 파일들이 생성됐다.
  • ⑨ 실행 파일을 실행한다.
  • ⑩ "인사 잘~한다"

3. C++ 프로젝트 디렉토리 구조 만들기

  • modules: 라이브러리
  • examples: 모든 코드의 entry point(main)
  • thirdparty: 모든 서드파티 라이브러리를 로컬하게 설치
  • Dockerfile: docker 파일
  • scripts: shell script
  • config: configuration
  • data: data
  • docs: document
  • test: test
  • resources: test에 사용할 resource

4. Build Tutorial

4.1. OpenCV를 사용하는 라이브러리 하나 빌드

  • OpenCV install

    • thirtparty 폴더에 OpenCV 폴더 생성
    • OpenCV 폴더에 OpenCV 클론(opencv 폴더가 생성됨)
    • OpenCV 폴더에 build 폴더와 install 폴더 생성
    • $ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../opencv: install 폴더에 debug 모드로 빌드하기 위해 generate
    • $ make -j7: 빌드
    • $ sudo make install
  • module1 만들기(멤버 변수로 cvmat을 넣은 class를 하나 만들어서 opencv를 사용)

    • 헤더 파일들 연결
    • 라이브러리 링킹
    • 빌드까지 확인

4.2. OpenCV를 사용하는 프로그램 하나 빌드

4.3. OpenCV와 Eigen3 라이브러리를 사용하는 프로그램 빌드

  • eigen install

    • thirdparty 폴더에 Eigen3 폴더 생성
    • Eigen3 폴더에 Eigen3 클론
    • Eigen3 폴더에 build 폴더와 install 폴더 생성
    • $ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../eigen
    • $ make -j7
    • $ sudo make install
  • module2에 eigen3를 랩핑하는 라이브러리 만들기


4.4. 정리

  • 최종 상태
    • thirdparty: 직접 빌드한 OpenCV, Eigen3 라이브러리가 있다.
    • modules: 분리해둔 module들이 있다.
      • 각 module마다 CMakeLists.txt로 필요한 라이브러리들을 가져와서 링크했다.
        • module1: OpenCV를 가져왔음
        • module2: Eigen3를 가져왔음
    • CMakeLists.txt: 빌드한 모듈들을 가져와서 examples 폴더에 있는 main문들에 엮어서 프로그램들을 만들었다.
  • 사용한 커맨드

    명령어설명
    add_subdirectory하위 디렉토리의 CMakeLists.txt를 읽어들임
    add_executable실행 파일을 생성
    add_library라이브러리를 생성
    find_package서드파티 라이브러리를 로드
    target_include_directories(?) 생성되는 파일이나 라이브러리의 헤더 파일을 연결
    target_link_libraries타겟 파일 또는 타겟 라이브러리에 라이브러리를 링크
    message디버깅 및 로깅에 사용

📙 강의

  • 스트라드비젼 Visual SLAM 연구원 장형기
  • HolyGround 대표 양은성
profile
JUST DO IT.

0개의 댓글