[CMake] 기초 템플릿

2023. 3. 1. 14:06Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

Shell Script 기초 템플릿이 필요합니다.

 

 

 


2. Why? (원인)

  • 하기에 미리 만들어 놓고자 합니다.

3. How? (해결책)

  • 폴더구조
    ├── CMakeLists.txt : (1)
    ├── main.cpp

    ── FOLDER_NAME1
          ├── CMakeLists.txt : (2)
          ├── temp.hpp
          └── temp.cpp
    └── FOLDER_NAME2
          ├── CMakeLists.txt : (2)
          ├── temp.hpp
          └── temp.cpp
  • 가장 상위단의 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MY_PROJECT)
#---------------------------------------
# Simple Options
#---------------------------------------
add_compile_options(-std=c++11 -Werror=return-type -Wall)
set(CMAKE_BUILD_TYPE Debug)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pthread -Wno-deprecated-declarations")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
#add_compile_definitions(_DEBUG)
endif()
message(STATUS "Build Status: ${CMAKE_BUILD_TYPE}")
#---------------------------------------
# Dependencies Basic
#---------------------------------------
set(INCLUDES
${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
)
include_directories(
${INCLUDE}
/usr/include/x86_64-linux-gnu
)
set(LIBS
${CMAKE_CURRENT_SOURCE_DIR}/abc.so
-L/usr/local/lib
-lpthread
)
link_libraries(${LIBS})
#---------------------------------------
# Compile
#---------------------------------------
#set(BUILD_LIBRARY 1)
file(GLOB_RECURSE TARGET_FILES
${CMAKE_CURRENT_SOURCE_DIR}/app/*.c,
${CMAKE_CURRENT_SOURCE_DIR}/app/*.cpp)
if(DEFINED BUILD_LIBRARY)
add_library(${PROJECT_NAME}
STATIC
${TARGET_FILES}
)
target_link_libraries(${PROJECT_NAME} PRIVATE
${LIBS}
)
else()
add_executable(${PROJECT_NAME}
main.cpp
${TARGET_FILES}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR}/binaryfolder
)
target_link_libraries(${PROJECT_NAME} PRIVATE
${LIBS}
)
endif()
#---------------------------------------
# Cuda Compile(Options)
#---------------------------------------
#[[
find_package(CUDA REQUIRED)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -gencode arch=compute_30,code=sm_30)
file(GLOB cu *.cu)
cuda_add_executable(${PROJECT_NAME}
main.cpp
${cu}
)
]]
#---------------------------------------
# Dependencies
#---------------------------------------
#[[
# 1. OpenCV
find_package(OpenCV 3.4.0 EXACT REQUIRED)
set(OPENCV_DIR
${CMAKE_CURRENT_SOURCE_DIR}/opencv/include
)
file(GLOB OPENCV_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/opencv-3.4.9/lib/lib*.so)
set(OPENCV_LIBS
${OPENCV_DIR}/lib/libopencv_ml.so
${OPENCV_DIR}/lib/libopencv_dnn.so
${OPENCV_DIR}/lib/libopencv_core.so
${OPENCV_DIR}/lib/libopencv_cudev.so
${OPENCV_DIR}/lib/libopencv_flann.so
${OPENCV_DIR}/lib/libopencv_photo.so
${OPENCV_DIR}/lib/libopencv_shape.so
${OPENCV_DIR}/lib/libopencv_video.so
${OPENCV_DIR}/lib/libopencv_calib3d.so
${OPENCV_DIR}/lib/libopencv_highgui.so
${OPENCV_DIR}/lib/libopencv_imgproc.so
${OPENCV_DIR}/lib/libopencv_videoio.so
${OPENCV_DIR}/lib/libopencv_superres.so
${OPENCV_DIR}/lib/libopencv_imgcodecs.so
${OPENCV_DIR}/lib/libopencv_objdetect.so
${OPENCV_DIR}/lib/libopencv_stitching.so
${OPENCV_DIR}/lib/libopencv_videostab.so
${OPENCV_DIR}/lib/libopencv_cudaarithm.so
${OPENCV_DIR}/lib/libopencv_cudabgsegm.so
${OPENCV_DIR}/lib/libopencv_cudalegacy.so
${OPENCV_DIR}/lib/libopencv_cudastereo.so
${OPENCV_DIR}/lib/libopencv_features2d.so
${OPENCV_DIR}/lib/libopencv_cudafilters.so
${OPENCV_DIR}/lib/libopencv_cudaimgproc.so
${OPENCV_DIR}/lib/libopencv_cudaoptflow.so
${OPENCV_DIR}/lib/libopencv_cudawarping.so
${OPENCV_DIR}/lib/libopencv_cudaobjdetect.so
${OPENCV_DIR}/lib/libopencv_cudafeatures2d.so
)
include_directories(${OPENCV_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENCV_LIBS})
]]
# 2.Cuda
#[[
include_directories(/usr/local/cuda-10.2/include)
target_link_libraries(${PROJECT_NAME} PRIVATE /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudart.so)
]]
# 3.TensorRT
#[[
set(TRT_VERSION 7.0)
set(TRT_DIR
${CMAKE_CURRENT_SOURCE_DIR}/tensorRT
)
if(${TRT_VERSION} EQUAL 7.0)
include_directories(${TRT_DIR}/include)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvinfer.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvparsers.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvonnxparser.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvinfer_plugin.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libmyelin.so)
elseif(${TRT_VERSION} EQUAL 7.2)
include_directories(${TRT_DIR}/include)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvinfer.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvparsers.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvonnxparser.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvinfer_plugin.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libmyelin.so)
elseif(${TRT_VERSION} EQUAL 5.0)
include_directories(${TRT_DIR}/include)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvinfer.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvparsers.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvonnxparser.so)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRT_DIR}/lib/libnvinfer_plugin.so)
else()
message("ERROR : NO CUDA VERSION SUPPORTED")
endif()
]]
#---------------------------------------
# Sub Compile
#---------------------------------------
add_subdirectory(FOLDER_NAME1)
add_subdirectory(FOLDER_NAME2)
target_link_libraries(${PROJECT_NAME} ${FOLDER_NAME1_PROJECT} ${FOLDER_NAME2_PROJECT})
foreach(SAMPLE ${SAMPLES})
add_subdirectory(SOURCE/${SAMPLE})
message("-----------------\n\n\n${SAMPLE}\n\n\n----------------")
endforeach()
  • 아래 단의 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MY_PROJECT_SUB)
#---------------------------------------
# Simple Options
#---------------------------------------
add_compile_options(-std=c++11 -Werror=return-type -Wall)
set(CMAKE_BUILD_TYPE Debug)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pthread -Wno-deprecated-declarations")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
#add_compile_definitions(_DEBUG)
endif()
message(STATUS "Build Status: ${CMAKE_BUILD_TYPE}")
#---------------------------------------
# Compile
#---------------------------------------
if(DEFINED BUILD_LIBRARY)
add_library(MY_PROJECT
MyFile1.cpp
MyFile2.cpp
MyFile3.cpp
)
else()
target_sources(MY_PROJECT PRIVATE
MyFile1.cpp
MyFile2.cpp
MyFile3.cpp
)
endif()

 

이를 이용해 CMakeLists를 잘 짜보도록하자.

mkdir build
cd build
cmake ..
make
cd ..
./build/binary/myfile
더보기

-----------------------------------------------------------------------------------------------------

<CMake 추가특징>

  • ★add_executable
    add_executable(PROJECTNAME{EXE_SOURCES})
    ex) EXE_SOURCES : 필요한 소스파일들, A.cpp, B.cpp …
  • add_library(A 옵션 소스.cpp)
    <옵션> STATIC : 정적, SHARED : 동적
  • find_package
    find_package(OpenCV 최소버전)
    find_package(OpenCV 3.4.0 EXACT REQUIRED)
    find_package(CUDA REQUIRED)
    <옵션>  EXACT : 정확한 버전, REQUIRED : 안찾아지면 throws an error, QUIET : 아무 메시지 안보이게
  • cmake_current_source_dir : 현재 코드  ex)/FOLDER/MYFOLDER
    cmake_current_binary_dir : build에서의 현재  ex)/FOLDER/build/MYFOLDER
    cmake_current_list dir : 현재코드 ex)/FOLDER
    cmake_binary_dir : build ex)/FOLDER/build
    cmake_source_dir : 아예시작점 ex)/FOLDER

 

 

-----------------------------------------------------------------------------------------------------

 


 

728x90
반응형