cmakeの使い方

[[https://cmake.org/cmake/help/latest/index.html][CMake Documentation]]

環境はbookwormです。

CMakeLists.txtを書く

 1  # CMakeのバージョンを設定
 2  cmake_minimum_required(VERSION 3.8)
 3  # プロジェクト名と使用する言語を設定
 4  set(APP_NAME hoge)
 5  project(${APP_NAME} VERSION 0.0 LANGUAGES CXX)
 6
 7  # C++標準の指定
 8  set(CMAKE_CXX_STANDARD 17)# 11,14,17(3.8),20(3.12),23(3.20),26(3.25)
 9  set(CMAKE_CXX_STANDARD_REQUIRED ON)
10
11  add_definitions("-Wall")
12
13  #makeの完全な実行コマンドを表示
14  #set(CMAKE_VERBOSE_MAKEFILE 1)
15
16  #srcファイル名を記述。hppは不要
17  set(SRC
18  main.cpp
19  huga.cpp
20  gaoo.cpp
21  )
22
23  # APP_NAMEという実行ファイルをSRCから作成
24  add_executable(${APP_NAME} ${SRC})

make、実行ファイルの作成、実行

1  $ cmake -S . -B build
2  $ cmake --build build
3  $ ./build/hoge

-S : path-to-src -B : path-to-build –build <build dir>

buildという名前のdirectoryを作成し、その中で作業を全部してくれる。

<build dir>を作らなくても、このスクリプトで勝手に作成してくれる。
makeを叩かなくても、実行ファイルを作成(2行目のcmakeで.oを作成,link)。

src修正時は、buildに入って、makeする(cmakeは不要)

srcを複数directoryに分割している場合

directoryごとにCMakeLists.txtを用意

- main.cpp,huga.cpp,gaoo.cpp
  CMakeLists.txt
  subdir
    |- CMakeLists.txt
    |- subf.cpp
    |- subf.hpp

subdir/CMakeLists.txt

subdirをまとめて1つのLIBにする。

1  cmake_minimum_required(VERSION 3.8)
2  set(SRC_SUB subf.cpp)
3  set(LIB sub)#subという名前をつける。
4
5  #libraryとして結合するとき
6  add_library(${LIB} STATIC ${SRC_SUB})
7  #objectとして結合するとき
8  add_library(${LIB} OBJECT ${SRC_SUB})

CMakeLists.txtに以下追記

subdirのLIB(sub)を結合する

ライブラリとして結合する場合

1  add_subdirectory(subdir)
2  target_link_libraries(${APP_NAME} PRIVATE sub)

オブジェクトとして結合する場合

add_executableを修正

1  add_subdirectory(subdir)
2  add_executable(test test.cpp $<TARGET_OBJECTS:sub>)

ライブラリ結合

rt pthread (調査中)

LDLIBS = -lm -lrt -pthread

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(main Threads::Threads)

引用元

https://qiita.com/yumetodo/items/bd8f556ab56298f19ba8
https://stackoverflow.com/questions/1620918/cmake-and-libpthread

そのうち動作確認します

realtime

調査中

Eigen

find_package(Eigen3 REQUIRED)
message(STATUS "Found Eigen-" ${EIGEN3_VERSION_STRING})
#add_executableのあとに追加
target_link_libraries(main Eigen3::Eigen)

OpenCV

https://blog.neno.dev/entry/2018/06/12/so-using-cmake/

find_package(OpenCV REQUIRED) #OpenCV見つけてきて 
include_directories(${OpenCV_INCLUDE_DIRS}) #インクルードディレクトリ指定 
add_executable(Main main.cpp) #吐き出す実行ファイルと使うソースコードの指定 
target_link_libraries(Main ${OpenCV_LIBRARIES}) #ライブラリとリンク

参考 ディレクトリ指定おまじない

include_directories(/usr/local/include)
link_directories(/usr/local/lib)