$ sudo apt-get install -y cmake
$ git clone https://github.com/opencv/opencv.git

$ cd dev_opencv
$ mkdir build
$ mkdir install

$ cd build
$ cmake ../opencv/ --> 이렇게만해도 generate된다
$ cmake -DCMAKE_BUILD_TYPE=Debug ../opencv
-D는 파라미터를 의미
-DCMAKE_BUILD_TYPE=Debug 또는 Release 사용
릴리즈 모드 : 코드 최적화, 디버깅하기 어렵다
$ cmake -DCMAKE_BUILD_TYPE=Release ../opencv
-G 사용$ cmake -DCMAKE_BUILD_TYPE=Release -GNinja ../opencv
-DCMAKE_INSTALL_PREFIX=원하는 경로$ cmake -DCMAKE_BUILD_TYPE=Release -GNinja -DCMAKE_INSTALL_PREFIX=../install ../opencv
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install ../opencv

$ make
또는
$ make -j (난 이걸로 하니 터져버렸다...)
makefile 기준으로 빌드가 된다.
-j : 동시에 빌드를 할 수 있는 작업의 수, 보통 core하나당 작업이 하나씩 할당되어 병렬 빌드 -> 더 빠르게 빌드가 된다-j2 이런식으로 동시 작업의 수를 정해준다. 자신의 전체 core 수보다 2개 정도 작게 잡으면 좋다빌드 파일에서
$ sudo make install
참고 : https://geeks-mimic.tistory.com/62
홈 디렉토리에 hello_cmake 폴더를 만든다
cmake : 빠른 시작 -> gcc 선택 -> c++ 선택

결과로 이렇게 만들어 진다.

cmake_minimum_required(VERSION 3.0.0)
project(hello_cmake VERSION 0.1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(hello_cmake main.cpp)
빌드
vscode 아래의 빌드 버튼을 누르면 빌드가 진행된다.
실행
실행 버튼을 누르면 실행된다.
(1) 헤더 파일과 소스 파일 분리하는 방법
(2) modules 폴더 안에 여러 module 폴더를 만들고 각각의 폴더에 헤더파일과 소스파일을 둘다 넣어둔다
-> 둘다 섞어서 쓰시는 걸 좋아한다

examples 폴더 : main 문들만 있다. 모든 코드들의 entry point
thirdparty : thirdparty 라이브러리
최종

$ cd thirdparty
$ mkdir OpenCV
$ cd OpenCV
$ git clone https://github.com/opencv/opencv.git

$ mkdir build
$ mkdir install

$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../opencv
$ make
$ sudo make install
#ifndef HELLO_CMAKE_CLASSMAT_HPP
#define HELLO_CMAKE_CLASSMAT_HPP
class ClassMat
{
public:
ClassMat() = default;
private:
cv::Mat cv_mat_;
};
#endif
#include "module1/ClassMat.hpp"
cmake_minimum_required(VERSION 3.0.0)
project(hello_cmake VERSION 0.1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_subdirectory(modules)
add_executable(hello_cmake main.cpp)
add_subdirectory(module1)
cmake_minimum_required(VERSION 3.0.0)
project(module1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
//소스파일이 어떤 것들이 잇는지, 다른 cpp 파일이 생기면 여기에 추가로 적으면 된다
//변수 MODULE_SOURCE_FILES 생성
set(MODULE1_SOURCE_FILES
src/ClassMat.cpp
)
//소스파일 기반 라이브러리 빌드를 위해
//라이브러리의 이름은 module1
//모든 소스파일들을 여기에 추가 `${}`이렇게 변수를 사용(안에 변수명을 적으면 된다)
add_library(module1
${MODULE_SOURCE_FILES}
)
//소스파일들을 사용한 헤더파일 연결
//특정 target 정해줌, 여기서는 module1, 즉 module1에 들어가는 헤더파일들에 대해서만
//어떻게 include 할지 정해줄 수 있다 : PRIVATE(외부에 노출 x), PUBLIC(이 라이브러리를 사용하는 상위 라이브러리들도 하위 라이브러리에 쉽게 접근할 수 있다) INTERFACE
//헤더 파일 include 해야함 -> 단순히 경로를 지정해주면 된다
//즉, target_include_directories (특정타겟 include방법지정 경로)
target_include_directories(module1 PRIVATE
include)
//include_directoriese : global, 모든 하위 cmakelist 에서도 적용가능
//thirdparty에서 opencv를 찾아야한다
//REQUIRED : 찾지 못했을 경우 빌드를 하지 않는다.
//fins_package는 시스템에 저장된 것들 먼저 찾는다 -> 우리는 local에 설치 했기 때문에 hint 를 사용해서 경로를 지정해야한다.
//CMAKE_SOURCE_DIR : 가장 최상위 ,entry directory를 의미한다(여기에서는 hello_cmake폴더)
//find_package랑 호환되는 모든 라이브러리들은 '라이브러리이름config.cmake' -> 이걸 찾아서 연결해줘야한다 -> 그 파일이 있는 경로를 적어주면 된다.
find_package(OpenCV REQUIRED HINTS ${CMAKE_SOURCE_DIR}/thirdparty/OpenCV/install/lib/cmake/opencv4)
빌드

아직 이런 에러가 있다
opencv가 찾아졌는지 확인해본다
//config.cmake에서 라이브러리를 찾았으면 `라이브러리_FOUND`가 true가 된다
//message(STATUS ) : 빌드를 할 때 상태 출력
if (OpenCV_FOUND)
message(STATUS "opencv found!! - ${OpenCV_DIR}")
endif()

target_include_directories(module1 PRIVATE
include
${OpenCV_INCLUDE_DIRS}
)
exec_module1.cpp 파일 생성#include "module1/ClassMat.hpp"
#include <iostream>
int main()
{
const auto instance = ClassMat();
std::cout << "success" << std::endl;
return 0;
}
add_executable(exec_module1 examples/exec_module1.cpp)
target_link_libraries(exec_module1 PRIVATE
module1)

--> 아니 다 똑같이 했는데 헤더파일이 없다고 뜬다... 이것저것 해보다가 안되서 vscode를 껐다가 키니까 됐다... 이게 뭔가....ㅠㅠ
https://gitlab.com/libeigen/eigen
$ cd
$ cd hello_cmake
$ cd thirdparty
$ mkdir Eigen3
$ cd Eigen3
$ git clone https://gitlab.com/libeigen/eigen.git
$ mkdir build
$ mkdir install
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../eigen
$ make
$ sudo make install

#ifndef HELLO_CMAKE_HPP
#define HELLO_CMAKE_HPP
#include "Eigen/Dense"
class ClassEigenMat
{
public:
ClassEigenMat() = default;
private:
Eigen::Matrix3d eigen_mat_;
};
#endif
#include "module2/ClassEigenMat.hpp"
cmake_minimum_required(VERSION 3.0.0)
project(module2 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(MODULE2_SOURCE_FILES
src/ClassEigenMat.cpp
)
add_library(module2
${MODULE2_SOURCE_FILES}
)
find_package(Eigen3 REQUIRED HINTS ${CMAKE_SOURCE_DIR}/thirdparty/Eigen3/install/share/eigen3/cmake)
if (Eigen3_FOUND)
message(STATUS "Eigen3 found!! - ${Eigen3_DIR}")
set(Eigen3_LIBS Eigen3::Eigen)
endif()
target_include_directories(module2 PUBLIC
include
${Eigen3_INCLUDE_DIRS}
)
target_link_libraries(module2 PUBLIC
${Eigen3_LIBS}
)
set(Eigen3_LIBS Eigen3::Eigen)add_subdirectory(module2)
exec_module1_module2.cpp 파일 만들기#include "module1/ClassMat.hpp"
#include "module2/ClassEigenMat.hpp"
#include <iostream>
int main()
{
const auto mat_module1 = ClassMat();
const auto mat_module2 = ClassEigenMat();
std::cout << "success!!" << std::endl;
}
add_executable(exec_module1_module2 examples/exec_module1_module2.cpp)
target_link_libraries(exec_module1_module2 PRIVATE
module1
module2
)