cmakeをつかう

konnyaku

きっかけ

アークナイツ自動周回の記事でc++を使ったが、 コンパイル時にフレームワークやらpkg-configやらを入力していたので、大変。

g++ -std=c++11 -framework CoreGraphics -framework CoreFoundation main.cpp `pkg-config --cflags opencv4` `pkg-config --libs opencv4`

コンパイルしたい時にいちいちメモを開かないといけない。

cmakeを使えばそんなことをしなくていい気がするので使ってみる。

まずは基本をやってみる

  1. main.cppとCMakeLists.txtを書く
main.cpp
#include <iostream>
int main() {
  std::cout << "Hello, world!" << std::endl;
  return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(hello_world CXX)
add_executable(main_app main.cpp)
  1. buildフォルダを作る(ごちゃごちゃするから)
<プロジェクトディレクトリ>
|-main.cpp
|-CMakeLists.txt
|-build/
  1. buildフォルダ内でConfigureとGenerateを実行する
shell
cmake ..

..はCmakeList.txtの場所を示す configure

  1. ビルドする
shell
cmake --build . 

.はbuildフォルダを示す

build

  1. 結果

result

実際にcmakeを適用してみる

外部ライブラリの導入

とりあえず上記のCMakeLists.txtのままやってみたら外部ライブラリのincludeでエラーを出したのでやってみる。

find_package()で外部ライブラリを探せる。 CMakeLists.txtにfind_package(OpenCV 4.5.1)という一文を追加したらちゃんと探せた。

shell
-- Found OpenCV: /usr/local/Cellar/opencv/4.5.1_2 (found suitable version "4.5.1", minimum required is "4.5.1") 

最終的に【C++】OpenCV3をOSXにインストールしてcmakeで優勝💪💪【完全に理解した】 をコピペした

CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(arknights_auto CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
find_package(OpenCV 4.5.1 REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable(main_app main.cpp)
target_link_libraries(main_app ${OpenCV_LIBS})

CMAKE_CXX_STANDARDにはバージョン、 CMAKE_CXX_FLAGSにoptionをセットできる。 ここでは直接入力値を代入できるが、add_definitionsでも設定できる。 include_directoriesでincludeして、 target_link_librariesでopencvのライブラリとリンクしている。 フレームワークもこれで指定できる。 でもtarget_link_librariesは使わないライブラリもリンクするからよくないらしい。 CoreGraphicsのフレームワークもこれで入れる。 最終的には次のようにしてコンパイルできるようになった。

CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(arknights_auto CXX)
set(CMAKE_CXX_STANDARD 11)
add_definitions(-std=c++11 -Wall)
find_package(OpenCV 4.5.1 REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable(main_app main.cpp)
target_link_libraries(main_app ${OpenCV_LIBS})
target_link_libraries(main_app "-framework CoreGraphics")
target_link_libraries(main_app "-framework CoreFoundation")

final

参考

勝手に作るCMake入門 その1 基本的な使い方

OpenCV4.1.0をCMakeを使って導入する方法(Visual Studio 2019)

【C++】OpenCV3をOSXにインストールしてcmakeで優勝💪💪【完全に理解した】

CMake覚え書き

最後のリンクは項目化してあってわかりやすい