cross-platform : 어떤 플랫폼에서도 사용 가능한 범용적 소프트웨어
윈도우 PC, 맥, 우분투, 안드로이드..
컴파일러와 독립적인 작동 방식을 가짐
빌드를 해주는 주체는 아니지만 어떠한 시스템에도 맞는 빌드 파일을 생성해주는 역할을 함
System
System OS
Hardware architecture
CPU architecture : amd64x86, arm aarch64
플랫폼(system)이 다르면 소프트웨어도 이어지지 않음
동일한 소스 코드를 타겟 시스템에서 직접 재빌드를 하거나
호스트 PC에서 타겟 보드로 cross compile
호스트 PC : amd64x86
타겟 보드 : arm aarch64
cmake 설치
sudo apt install -y cmake
opencv github에서 소스 다운
OpenCV github
git clone https://github.com/opencv/opencv.git
 
mkdir build install
cd build
cmake를 이용해서 opencv 빌드
generate하고 싶은 프로젝트에 CMakeLists.txt가 존재하는 가장 상위 디렉터리 경로
cmake ../opencv/
cmake -DCMAKE_BUILD_TYPE=Debug ../opencvcmake -DCMAKE_BUILD_TYPE=Release ../opencvsudo apt install ninja-buildcmake -DCMAKE_BUILD_TYPE=Release -GNinja ../opencv/usr/local/libcmake -DCMAKE_BUILD_TYPE=Release -GNinja -DCMAKE_INSTALL_PREFIX=../install ../opencv병렬 빌드 작업 수 설정
CPU 코어 하나 당 작업 하나씩 할당
make -jN
현재 CPU 코어 16개
 
유저가 필요한 파일만 따로 복사
sudo make install
 
hello_cmake 프로젝트에 C++를 사용
project(hello_cmake LANGUAGES CXX)
14로만 빌드
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 14)빌드
 
실행
 
hello_cmake
├ CMakeLists.txt
├ modules
│ ├ CMakeLists.txt
│ ├ module1
│ │ ├ CMakeLists.txt
│ │ ├ include
│ │ │ └ module1
│ │ │   └ ClassMat.hpp
│ │ └ src
│ │   └ ClassMat.cpp
│ ├ module2
│ │ ├ CMakeLists.txt
│ │ ├ include
│ │ │ └ module2
│ │ │   └ ClassEigenMat.hpp
│ │ └ src
│ │   └ ClassEigenMat.cpp
│ └ module3
│   ├ include
│   └ src
├ examples
│ ├ exec_module1.cpp
│ └ exec_module1_module2.cpp
└ thirdparty
  ├ OpenCV
  │ ├ build
  │ ├ install
  │ └ opencv
  └ Eigen3
    ├ build
    ├ install
    └ eigenregenerate 진행 시 문제 발생
 
캐시 삭제
rm -rf CMakeCache.txt CMakeFiles/
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../opencv
make -j
sudo make install
Eigen3 gitlab
git clone https://gitlab.com/libeigen/eigen.git
mkdir build install
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../eigen
sudo make install
add_subdirectory 하위 CMakeLists.txt를 읽기 위함
add_executable 실행 파일 생성
add_library 라이브러리 생성
find_package thirdparty library 로딩
target_include_directories 헤더 파일 연결
target_link_libraries 타겟 라이브러리에 라이브러리 연결
message 디버깅 용도