プログラム / 2010/01/02 (Sat) / 編集 |
あちらこちらでコンパイルするならcmakeが便利!ということでcmakeの勉強。何が便利ってXcodeのプロジェクトを生成できるのがすっごく便利!
ただドキュメントがあんまり存在しないので(helpを見れってことらしい)最初はめんどくさい。。。以下は一応Macの場合だけど、LinuxやWindowsでもほぼ問題なく動作すると思われ。
ただドキュメントがあんまり存在しないので(helpを見れってことらしい)最初はめんどくさい。。。以下は一応Macの場合だけど、LinuxやWindowsでもほぼ問題なく動作すると思われ。
cmakeコマンド
cmakeコマンドオプションcmake [オプション] パスコマンドを実行すると「CMakeCache.txt」「cmake_install.cmake」「CMakeFiles」とプロジェクトファイル(デフォルトでは「Makefile」)が生成される。ただの設定ファイルなのでCMakeLists.txtの記述が正確なら別に気にしなくてもいい。
- --help-variable-list 利用できる変数一覧、「--help-variable 変数名」で詳細表示
- --help-command-list 利用できるコマンド一覧、「--help-command コマンド名」で詳細表示
- --help-command-list 利用できるプロパティ一覧、「--help-property-list プロパティ明」で詳細表示
- -G ジェネレータ デフォルトではMakefileが生成されるが、これでジェネレータを変更すれば他のプロジェクトファイルを生成できる。「-G Xcode」とかするとXcodeのプロジェクトファイルが生成される。
cmakeの設定ファイル(CMakeLists.txt)
ヘルプで調べたコマンドやプロパティを組み合わせて書くんだけど、代表的なやつをピックアップ。よく使うコマンド
- cmake_minimum_required(VERSION major[.minor[.patch]] [FATAL_ERROR]) 要求するcmakeのバージョンの指定、「cmake_minimum_required(VERSION 2.6)」と書くと、cmakeのバージョンが2.6未満の時にエラーになる。
- PROJECT(プロジェクト名) プロジェクト名の指定
- include_directories(INCLUDE_PATH) includeディレクトリのパスを指定(-Iオプションに使われる)
- link_directories(LIBRARY_PATH) libディレクトリのパスを指定(-Lオプションに使われる)
- add_definitions(definitions1 definition2 ...) definitionの指定。「add_definitions(-DDEBUG)」とか。
- set_target_properties(ターゲット プロパティ 値) ターゲットに対してプロパティを設定する。「set_target_properties(hellodemo LINK_FLAGS -lc)」とか。
- ADD_EXECUTABLE(ターゲット ソースコード) 実行ファイルを生成。「ADD_EXECUTABLE(hellodemo hello.c)」とか。
- target_link_libraries(ターゲット ライブラリ名) リンクするライブラリを指定。「target_link_libraries(hellodemo hello_lib) 」とか。
便利なコマンド
- add_library(ターゲット
IMPORTED)
ライブラリの生成。「ADD_LIBRARY(hello_lib SHARED libhello.c)」だと「libhello_lib.dylib」が生成される。
- OPTION(フラグ名 "簡単な説明" デフォルト) 自作のオプションを作成。「OPTION(FLAG_ONE "flag sample one with no value" OFF)」とか、使うときはコンパイル時に「-DFLAG_ONE=ON」とかする。
- SUBDIRS(PATH) 一緒にコンパイルしたいディレクトリの指定。「SUBDIRS(demos)」とか。サブディレクトリにもCMakeLists.txtが必要です。
- MESSAGE("文字列") 文字列を出力
- FIND_PACKAGE(パッケージ名) パッケージを検索していろんな設定を読み込んでくれる超便利なやつ。例えば「FIND_PACKAGE(OpenGL)」とかするとキャッシュ「CMakeCache.txt」にOpenGLのパス(OPENGL_INCLUDE_DIR)とかを出力してくれる。
- IF(フラグ名) ~~ ELSE(フラグ名) ~~ ENDIF(フラグ名) if文での制御も可能。「IF(OPENGL_FOUND) ~~ ENDIF(OPENGL_FOUND)」とか。
設定ファイルの例
ライブラリのコンパイル例
CMakeLists.txt#プロジェクト名 PROJECT(libHelloWorld) #ライブラリの生成 ADD_LIBRARY(hello_lib SHARED libhello.c)libhello.h
void hello(void);libhello.c
#include <stdio.h> void hello(void) { printf("Hello, library world.\n"); }準備したらコンパイルしてみる。
%cmke . %make
hello world
「include/libhello.h」と「lib/libhello_lib.dylib」を利用するプログラムの例。CMakeLists.txt
#要求するcmakeのバージョン cmake_minimum_required(VERSION 2.6) #プロジェクト名 PROJECT(HelloWorld) #先にライブラリをコンパイルしとくこと #ヘッダファイルの場所を指定 include_directories(include) #ライブラリの場所を指定 link_directories(lib) #フラグ設定 ##LD_FLAG set_target_properties(hellodemo LINK_FLAGS -lc) ##コンパイラオプション set_target_properties(hellodemo COMPILE_FLAGS -Wall) #-D CMAKE_BUILD_TYPE=Debug した時だけつける set(CMAKE_CXX_FLAGS_DEBUG "-g -pg") #コンパイル時に使うdefinitionの指定 #全体に適用 add_definitions(-DFOO -DBAR ...) #add_definitions(-DDEBUG) #実行ファイル生成方法 ADD_EXECUTABLE(hellodemo hello.c) #ライブラリのリンク target_link_libraries(hellodemo hello_lib)hello.c
#include <stdio.h> #include "libhello.h" int main(){ printf("Hello\n"); //ライブラリの利用 hello(); //-DDEBUGされてたら表示される #ifdef DEBUG printf("Define debugg!!\n"); #endif return 0; }
%cmake . %make %./hellodemo Hello Hello, library world. Define debugg!!
PR
トラックバック
URL :
コメント