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 ../opencv
cmake -DCMAKE_BUILD_TYPE=Release ../opencv
sudo apt install ninja-build
cmake -DCMAKE_BUILD_TYPE=Release -GNinja ../opencv
/usr/local/lib
cmake -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
└ eigen
regenerate 진행 시 문제 발생
캐시 삭제
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
디버깅 용도