linuxでC/C++のプロジェクトを欠くことが増えてきて必要になってきたのですが,すごい癖があってかなりつまずきまくったのでメモを残して公開しておくことにします.
躓いたら,随時更新していきます.
構文について
最初に躓いたのは大文字がある種の定数変数なのかと思ったら,構文の一部だったりすることだった.
pythonだと
hoge(a,var1=b)
の様に書かれる構文が
hoge(a VAR1 b)
のように書かれることがある.しかも
hoge(a,var1=[b,c])
の意味で
hoge(a VAR1 b c)
と書かれることがある.
https://qiita.com/medaka5/items/c2aee6c24e6171888838
に書いてある
便利な変数たち,
C++のコンパイラオプションはCMAKE_C_FLAGS
, CのコンパイラオプションはCMAKE_CXX_FLAGS
変数
set(VARNAME hoge)
if 文
if ()
hogehoge
elseif ()
hogehoge
else()
hogehoge
endif()
()がないとシンタックスエラーなので注意
マクロで変数が定義されているかは if (DEFINE var)
で確認できる
マクロ
グローバルに設定するには
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
古いCMAKEだと
add_definitionsしか無い
https://cmake.org/cmake/help/latest/command/add_definitions.html
ターゲットごとに追加するには
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
のようにする。
コマンドの実行
cmake実行時にやりたいなら、execute_process
makeのときに実行したかったら?add_custom_command
を使う
コメントアウト
# comment
プリント文
message(STATUS "hogehoge")
STATUSの部分はWARNINGとかFATAL_ERRORなどにもできる。変数は${}で参照できる。
add_subdirectory
パスを追加するみたいな意味合いがあるっぽい?
https://cmake.org/cmake/help/v3.0/command/add_subdirectory.html
結局どこで実行ファイルが指定されているのか
add_executable( {実行ファイルの名前} sourcefile1 sourcefile2 ...)
のような感じで作られれる.
ライブラリをリンクするときは(gccの-L
を使いたいときは)
target_link_libraries({実行ファイルの名前} )
find_package
package(例えばOpenCV)が用意してくれるFind<package_name>.cmake
ファイルを探して実行することで,libとかheaderの場所を_LIB
,_INCLUDE
とかの変数に格納する.
自前でやる場合,手っ取り早いのはfind_library
とinclude_directories
を
https://cmake.org/cmake/help/v3.0/command/find_package.html
https://qiita.com/osamu0329/items/bd3d1e50edf37c277fa9
Debug/Releaseビルドを分ける
set(CMAKE_C_FLAGS_DEBUG "-g3")
set(CMAKE_C_FLAGS_RELEASE "-O2")
のように設定して, cmake
実行時にコマンドラインで
cmake -DCMAKE_BUILD_TYPE=Debug
か cmake -DCMAKE_BUILD_TYPE=Release
の様にすればよい.
なお一つのMakefileにまとめてくれるといった仕様はない模様.