[C++] CMakeLists 주요 커맨드

Lily·2023년 7월 10일
0

주로 사용되는 커맨드 파악하기

  • add_executable( [이름]  [소스파일] )

    지정된 [소스파일]을 사용하여 프로젝트에 실행 파일을 [이름]으로 생성함

  • add_library( [이름]  [소스파일] )

    지정된 [소스파일]을 사용하여 프로젝트에 [이름]으로 라이브러리를 추가함

  • add_subdirectory( [소스디렉토리] )

    현 위치 기준, 빌드에 사용되는 (상대경로일 경우 하위) [소스디렉토리]를 추가함

  • find_package( [패키지이름]  REQUIRED  [패키지가 위치한 디렉토리(lib or share/cmake/..)] )

    패키지(일반적으로 프로젝트 외부에서 제공됨, ex. openCV)를 찾고 해당 패키지 별 세부 정보를 로드함
    REQUIRED는 여러 옵션 중 하나로, 패키지를 못찾았을 경우 에러를 발생시킴

  • target_include_directories( [타겟]  PUBLIC  [Include 디렉토리] )

    지정된 [타겟]을 컴파일 할 때, 사용할 [Include 디렉토리]를 지정함
    [타겟]은 add_library() 혹은 add_excutable()로 선언된 [이름]을 사용해야 함
    PUBLIC은 여러 옵션 중 하나로, PUBLIC, PRIVATE, INTERFACE 를 골라 사용함

  • target_link_libraries( [타겟]  PUBLIC  [라이브러리 디렉토리] )

    지정된 [타겟] 혹은 해당 종속 항목을 연결할 때, 사용할 라이브러리 또는 플래그를 지정함
    [타겟]은 add_library() 혹은 add_excutable()로 선언된 [이름]을 사용해야 함
    PUBLIC은 여러 옵션 중 하나로, PUBLIC, PRIVATE, INTERFACE 를 골라 사용함

  • target_link_directories( [타겟]  PUBLIC  [디렉토리] )

    지정된 [타겟]을 연결할 때 링커가 라이브러리를 검색해야 하는 경로를 지정함 (사용 권장하지 않음)
    [타겟]은 add_library() 혹은 add_excutable()로 선언된 [이름]을 사용해야 함
    PUBLIC은 여러 옵션 중 하나로, PUBLIC, PRIVATE, INTERFACE 를 골라 사용함

  • message( STATUS  [메세지 텍스트] )

    CMakeLists를 작성할 때, print 해서 결과를 확인하려고 할 때 유용한 함수
    지정된 [메세지 텍스트]를 [모드]에 따라 로그로 남김, 여기서는 "STATUS"를 [모드]로 선택

빌드의 동작과정으로 이해하기

  • target : cmake로 빌드해야 하는 executable 혹은 library를 의미

  • library A를 생성하면, API(header/include files)와 컴파일 된 코드(.lib)가 제공됨

  • Project B에서 library A를 사용하기 위해, header file을 include 해야 함, 그 후에 Project B를 컴파일 할 수 있게 됨

  • 또한, Project B의 바이너리를 만들려면 컴파일 된 A를 링크를 하는 작업이 필요함

  • target_include_directories는 B의 cmake가 어디에서 (A 포함) API header를 찾아야 하는 지 명시해줌

  • target_link_directoriestarget_link_libraries는 같은 역할을 하는데, 단지 input이 lib directory냐 lib 그 자체냐의 문제로 다르며, 이들은 cmake가 A의 컴파일된 코드를 어디서 가져와야 하는 지에 대해 알려주는 역할을 함

  • 만약 library가 header-only이면 link는 사용할 필요가 없음

profile
First Attempt In Learning

0개의 댓글