[c++] CMakeList 문법

About_work·2024년 10월 16일
0

c++

목록 보기
13/17

1. 개요

1. find_package(OpenCV REQUIRED)

문법적 동작 원리

  • find_package(): CMake가 시스템에서 OpenCV 라이브러리를 찾는 명령
  • REQUIRED: OpenCV를 반드시 찾아야 한다는 조건이야. 만약 OpenCV를 찾지 못하면 빌드가 중단되고 에러가 발생해.

왜 필요할까?

  • OpenCV는 여러 헤더 파일과 라이브러리 파일로 이루어져 있어. 컴파일러가 OpenCV를 사용하려면 어디에 있는지 경로를 알아야 해.
  • find_package()는 시스템에서 OpenCV를 찾아서 경로 정보와 라이브러리 정보를 제공해.

결과

  • 이 명령어가 성공적으로 실행되면 CMake는 두 가지 변수를 설정해:
    • ${OpenCV_INCLUDE_DIRS}: OpenCV의 헤더 파일들이 위치한 경로.
    • ${OpenCV_LIBS}: OpenCV의 필요한 라이브러리 목록.

2. include_directories(include ${OpenCV_INCLUDE_DIRS})

문법적 동작 원리

  • include_directories(): 컴파일할 때 사용할 헤더 파일 경로를 포함하는 명령어야.
    • 여기서 include/: 네가 만든 프로젝트의 헤더 파일 폴더(예: Calculator.h).
    • ${OpenCV_INCLUDE_DIRS}: find_package()가 찾은 OpenCV 헤더 파일 경로.

왜 필요할까?

  • C++에서 #include로 헤더 파일을 가져올 때, 컴파일러가 헤더 파일이 어디 있는지 알아야 해.
  • 이 명령어를 통해 컴파일러가 OpenCV 헤더 파일과 프로젝트의 헤더 파일을 모두 찾을 수 있게 도와줘.

예시

만약 네가 코드에서 이렇게 사용한다면:

#include <opencv2/opencv.hpp>
  • 컴파일러는 opencv.hpp 파일을 ${OpenCV_INCLUDE_DIRS} 경로에서 찾아.

문법적 동작 원리

  • target_link_libraries(): 빌드할 실행 파일(calculator)과 필요한 라이브러리 파일들을 연결(link) 하는 명령어야.
    • ${OpenCV_LIBS}: OpenCV 라이브러리들의 목록이 이 변수에 담겨 있어.

왜 필요할까?

  • C++에서는 코드에서 외부 라이브러리(예: OpenCV)를 사용하려면, 컴파일뿐 아니라 링크 과정에서도 해당 라이브러리를 연결해야 해.
  • OpenCV에는 이미지 처리 함수들이 들어있는 .so(Linux)나 .dll(Windows) 라이브러리 파일들이 필요해.
  • 이 명령어를 사용해 컴파일러가 OpenCV의 라이브러리를 링크해주지 않으면, 컴파일은 성공해도 실행할 때 오류가 나게 돼.

실행 시 오류 예시

  • 만약 링크하지 않으면 이런 에러가 나올 수 있어:
    undefined reference to `cv::imshow(...)'
    이건 OpenCV 함수를 찾지 못해서 생기는 오류야.

4. 전체 흐름 정리

  1. find_package(OpenCV REQUIRED):

    • 시스템에서 OpenCV를 찾고, 관련 헤더와 라이브러리 경로 정보를 변수에 저장해.
  2. include_directories(include ${OpenCV_INCLUDE_DIRS}):

    • 컴파일러가 프로젝트와 OpenCV의 헤더 파일 경로를 인식할 수 있도록 경로를 설정해.
  3. target_link_libraries(calculator ${OpenCV_LIBS}):

    • 컴파일러가 빌드한 실행 파일에 OpenCV 라이브러리를 링크해서, OpenCV 함수를 사용할 수 있게 만들어.

5. 비유로 이해하기

  • find_package(): “OpenCV 책이 어디 있는지 찾아와.”
  • include_directories(): “찾아온 책의 내용(헤더 파일)을 읽을 수 있게 설정해.”
  • target_link_libraries(): “이 책(라이브러리)을 실제로 사용할 수 있도록 연결해.”

6. 결론

  • 이 코드가 하는 일은 컴파일러가 OpenCV를 찾아서, 사용할 수 있도록 준비하고 연결하는 과정이야.
  • C++에서는 외부 라이브러리를 사용할 때 이런 준비 작업이 필요해. Python에서 import하는 것과 비슷하지만, 좀 더 복잡하게 구성돼 있는 거지.

이제 이해가 좀 됐을까? 더 궁금한 점이 있으면 언제든지 물어봐! 😊


2. 심화: find_package

7. 요약

  • find_package(OpenCV REQUIRED)CMake 설정 파일(OpenCVConfig.cmake)을 /usr/local/lib/cmake 등에서 찾는 거야.
  • OpenCV는 단순한 폴더 이름이 아니라, CMake가 사용할 수 있는 패키지 이름이야.
  • CMake가 이 설정 파일을 찾으면 OpenCV의 헤더 파일과 라이브러리 경로를 프로젝트에 포함시켜줘.


3. find_package()가 어디서 찾을까?

  • CMake는 보통 여러 경로를 차례대로 탐색해. 가장 많이 사용하는 경로는 다음과 같아:

    1. /usr/local/lib/cmake
    2. /usr/local/ 하위 경로들
    3. 환경 변수(CMAKE_PREFIX_PATHOpenCV_DIR)로 지정된 경로
    4. OpenCV를 직접 빌드한 경우 빌드 디렉터리
  • 즉, CMake는 /usr/local/bin이 아니라, /usr/local/lib/cmake 같은 경로에서 OpenCV의 설정 파일을 찾는 거야.


5. OpenCV가 설치된 후 구조

OpenCV를 설치한 후 보통 이런 경로 구조가 생겨:

/usr/local/lib/cmake/opencv4/
│── OpenCVConfig.cmake
│── OpenCVModules.cmake
...
/usr/local/include/opencv4/  # 헤더 파일 경로
/usr/local/lib/              # 라이브러리 경로
  • OpenCVConfig.cmake: 이 파일은 OpenCV가 설치된 경로와 필요한 라이브러리들을 정의해.
  • CMake는 find_package() 명령을 실행할 때 이 파일을 찾아 OpenCV의 헤더 파일과 라이브러리를 연결해주는 거야.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글