CMake
CMake란 cross platform으로 window, ubuntu, MacOS 등 다양한 운영 체제에서 사용이 가능하다. CMake를 활용하여 C++ 작업 공간을 구축할 수 있다.
내용 추가 예정 |
CMake install
- IDE : Clion
- Project name : hello_cmake
- build tools : WSL2 ubuntu 18.04
- terminal : WSL2 ubuntu 18.04
Package install
Directory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
project
⊢ CMakeLists.txt
⊢ examples
⊢ example1.cpp
⊢ example2.cpp
⊢ ...
⊢ modules
⊢ module1
⊢ module1
∟ include
∟ Class.hpp
⊢ src
∟ Class.cpp
∟ CMakeLists.txt
⊢ module2
⊢ module2
∟ include
∟ Class.hpp
⊢ src
∟ Class.cpp
∟ CMakeLists.txt
⊢ ...
⊢ main.cpp
∟ thirdparty
⊢ OpenCV
⊢ build
⊢ install
∟ opencv
∟ Eigen
⊢ build
⊢ install
∟ eigen
OpenCV install
OpenCV를 사용하기 위해서는 CMake 작업 공간에 OpenCV 라이브러리를 구성해야 한다.
1
2
3
4
5
6
7
8
hello_cmake$ mkdir thirdParty && cd thirdParty
thirdParty$ mkdir -P OpenCV/build && mkdir -P OpenCV/install
thirdParty$ cd OpenCV
OpenCV$ git clone https://github.com/opencv/opencv.git
OpenCV$ cd build
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install/ ../opencv/
build$ make -j4
build$ sudo make install
이렇게 OpenCV 라이브러리를 설치할 깃허브 레포지토리를 클론하고, 디렉토리를 구축한다.
이 때, cuda와 같은 contrib 를 함께 사용하고자 한다면, 다음과 같이 설정해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
build$ export "pathToPython=<python Path>" && export "pyVer=39"
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install/ \
-DOPENCV_EXTRA_MODULES_PATH="C:/opencv/opencv_contrib/modules" \
-DBUILD_opencv_world=ON -DWITH_CUDA=ON \
-DCUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6" \
-DCUDA_FAST_MATH=ON -DWITH_CUBLAS=ON -DCUDA_ARCH_BIN=8.6 -DWITH_NVCUVID=ON \
-DWITH_OPENGL=ON -DWITH_MFX=ON -DBUILD_opencv_python3=ON \
-DPYTHON3_INCLUDE_DIR=%pathToPython%/include \
-DPYTHON3_LIBRARY=%pathToPython%/libs/python%pyVer%.lib \
-DPYTHON3_EXECUTABLE=%pathToPython%/python.exe -DPYTHON3_NUMPY_INCLUDE_DIRS=%pathToPython%/lib/site-packages/numpy/core/include \
-DPYTHON3_PACKAGES_PATH=%pathToPython%/Lib/site-packages/ -DOPENCV_SKIP_PYTHON_LOADER=ON \
-DOPENCV_CONFIG_PATH=C:/opencv/opencv/install/x64/vc17/bin ../opencv/
pathToPython에는 자신의 python.exe 경로를 넣으면 된다. 그리고, pyVer도 본인의 python 버전에 맞게 넣는다.
Eigen install
1
2
3
4
5
6
7
8
9
thirdParty$ mkdir Eigen3
thirdParty$ cd Eigen3
Eigen3$ mkdir build
Eigen3$ mkdir install
Eigen3$ git clone https://gitlab.com/libeigen/eigen.git
Eigen3$ cd build
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../eigen/
build$ make -j4
build$ sudo make install
Pangolin install
1
2
3
4
5
6
7
thirdParty$ mkdir pangolin && cd pangolin
pangolin$ git clone https://github.com/stevenlovegrove/Pangolin.git
pangolin$ sudo apt install build-essential
pangolin$ sudo apt install libgl1-mesa-dev
pangolin$ sudo apt install libglew-dev
pangolin$ mkdir build && mkdir install
pangolin$ cd build
이렇게 작업공간을 다 생성한 후에는 cmake build를 진행한다. 동일하게 make -j에서 4는 코어 수이므로 자신의 컴퓨터에 맞게 설정해주면 된다.
1
2
3
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install/ ../Pangolin/
build$ make -j4
build$ sudo make install
CMakeLists.txt
- project/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(hello_cmake LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14) # set은 어떤 변수에 값을 넣어주는 것, CMAKE_CXX_STANDARD에 14를 넣는다.
set(CMAKE_CXX_STANDARD_REQUIRED ON) # CMAKE_ 는 종복 변수, 14를 넘어가는 기능들은 빌드가 되지 않도록 함.
add_subdirectory(modules)
add_executable(hello_cmake main.cpp) # 실행파일을 의미한다. 이런 실행파일을 만들 instructure를 추가하겠다.
# add_executable(실행파일의 이름, 프로그램을 만드는데 필요한 소스코드)
# examples/exec_module1.cpp 를 실행하는 코드
add_executable(exec_module1
examples/exec_module1.cpp
)
# exec_module1에 library를 링크
target_link_libraries(exec_module1 PUBLIC
module1
)
add_executable(exec_module1_module2 examples/exec_module1_module2.cpp)
target_link_libraries(exec_module1_module2 PUBLIC
module1
module2
)
- project/modules/CMakeLists.txt
add_subdirectory(module1)
add_subdirectory(module2)
- project/modules/module1/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
cmake_policy(SET CMP0111 OLD)
project(module1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(MODULE1_SOURCE_FILES # name
src/ClassMat.cpp
)
add_library(module1 # library name
${MODULE1_SOURCE_FILES} # add all files in MODULE1_SOURCE_FILES
)
# OpenCV package
find_package(OpenCV REQUIRED HINTS ${CMAKE_SOURCE_DIR}/thirdParty/OpenCV/install/lib/cmake/opencv4)
# if find, print directory
if (OpenCV_FOUND)
message(STATUS "OpenCV Found! - ${OpenCV_DIR}")
endif()
# header file directory
target_include_directories(module1 PUBLIC
include # directory
${OpenCV_INCLUDE_DIRS}
)
# library link - library link in module1
target_link_libraries(module1 PUBLIC
${OpenCV_LIBS}
)
- project/modules/module2/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(module2 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(MODULE2_SOURCE_FILES # name
src/ClassEigenMat.cpp
)
add_library(module2 # library name
${MODULE2_SOURCE_FILES} # add all files in MODULE1_SOURCE_FILES
)
find_package(Eigen3 REQUIRED HINTS ${CMAKE_SOURCE_DIR}/thirdParty/Eigen3/install/share/eigen3/cmake) # .cmake 파일 위치
if (Eigen3_FOUND)
message(STATUS "Eigen3 Found! - ${Eigen3_DIR}")
set(Eigen3_LIBS Eigen3::Eigen)
endif()
target_include_directories(module2 PUBLIC # header file directory
include # directory
${Eigen3_INCLUDE_DIRS}
)
target_link_libraries(module2 PUBLIC # library link
${Eigen3_LIBS}
)
Pangolin 에러
- GLEW 오류
cmake
시 Could not find GLEW
라는 에러가 발생할 수 있다. 이에 대해 libglew-dev
를 설치해서 해결해준다.
1
sudo apt install libglew-dev
- so파일 오류
- LD_LIBRARY_PATH 추가
.bash_profile
에 LD_LIBRARY_PATH를 추가해서 경로를 추가한다.
1
2
3
$ sudo gedit ~/.bash_profile
LD_LIBRARY_PATH=/mnt/c/Users/dkssu/CLionProjects/Trajectory/thirdparty/Pangolin/install/lib
1
$ source ~/.bash_profile
1
2
echo $LD_LIBRARY_PATH
/mnt/c/Users/dkssu/CLionProjects/Trajectory/thirdparty/Pangolin/install/lib
이렇게 환경변수가 등록되었다면, 이 경로를 실제 시스템에 등록한다.
1
sudo ldconfig
나의 경우는 이렇게 해도 실행이 되지 않아서 상대경로를 실제 경로로 수정했다.
1
std::string trajectory_file = "/mnt/c/Users/dkssu/CLionProjects/Trajectory/examples/trajectory.txt";
- PlotTrajectory 예시
- ld.so.conf 수정
1번 방법이 안된다면 ld.so.conf 파일을 수정한다.
1
2
$ more /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
이 값은 /etc/ld.so.conf
파일에 설정되어 있는 값이다. .conf 에 해당하는 모든 파일의 내용이 포함되어 있다. 이에 대해 새로운 라이브러리의 경로를 추가해줘야 한다. 일단 프로젝트에 필요한 *.so
파일을 확인한다.
1
2
3
4
5
$ ls thirdparty/Pangolin/install/lib
cmake libpango_glgeometry.so libpango_plot.so libpango_vars.so
libpango_core.so libpango_image.so libpango_python.so libpango_video.so
libpango_display.so libpango_opengl.so libpango_scene.so libpango_windowing.so
libpango_geometry.so libpango_packetstream.so libpango_tools.so libtinyobj.so
이 경로를 /etc/ld.so.conf
에 추가해준다.
1
2
3
$ cd /etc/ld.so.conf && sudo gedit pangolin.conf
/mnt/c/Users/dkssu/CLionProjects/Trajectory/thirdparty/Pangolin/install/lib
그 후, ldconfig
명령어로 시스템에 등록한다.
1
$ sudo ldconfig
reference
- so 파일 오류
- https://m.blog.naver.com/younguk0907/222084800809
- https://the-masked-developer.github.io/wiki/no-so-file/