CMake + Visual C++で、main関数を呼ばせる

OpenGLのようなプロジェクトでは、Windows上でコマンドプロンプトを表示させないためにexecutableにWIN32を付ける。

しかしWinMain()関数が呼ばれては困るので、main()関数が呼ばれるよう、以下のようにリンクフラグを追加する。

add_executable(MyApp main.cpp)

if (WIN32)
    set_target_properties(MyApp PROPERTIES
         LINK_FLAGS "/ENTRY:\"mainCRTStartup\"")
endif ()

変数が定義されているかを判定する

CMakeファイル内で、変数が定義されているかを調べるには、以下のようにする:

if (VARIABLE)
  ...
endif ()

if (${VARIABLE})ではない。

このような定義判定は、cmakeコマンドを呼び出す際の変数定義のために使用する:

cmake .. -DVARIABLE=1

参照

CMakeによって生成されるVisual C++のプロジェクトに、ディレクトリのフィルタを追加する

source_group()命令を使う。

source_group(フィルタ名 FILES ファイルリスト)
source_group(フィルタ名 REGULAR_EXPRESSION 正規表現で書かれたファイルリスト)

追記(2014/5/20)

サブディレクトリをフィルタ名に設定する場合は、ディレクトリ区切り文字を「\\」(バックスラッシュ x 2)にする必要がある。「/」(スラッシュ)ではダメ。

CMakeによって生成されるVisual C++プロジェクトの構成

CMake Visual C++
project ソリューション(.sln)
executable 実行ファイルプロジェクト(.vcxproj)
library スタティックライブラリプロジェクト(.vcxproj)

project内には、複数のexecutable/libraryを追加できる。Visual Studioでこのcmakeを実行すると、複数のプロジェクトが入ったソリューションが生成される。

ビルド順を制御するには、add_dependencies()命令を使う。以下のようにすると、exe_nameをビルドするには、lib1_namelib2_nameが必要(に依存している)という意味になり、exe_nameをビルドする前にライブラリがビルドされる。

project(my_project CXX)

add_executable(exe_name main.cpp)
add_library(lib1_name STATIC lib1.cpp)
add_library(lib2_name STATIC lib2.cpp)

# 依存関係の定義
add_dependencies(exe_name lib1_name lib2_name)

# リンク
target_link_libraries(exe_name lib1_name lib2_name)

出力ディレクトリを指定する

CMakeで出力ディレクトリを指定するには、以下の変数にディレクトリを指定する必要がある。

実行ファイルの場合:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../../../libs)

スタティックライブラリの場合(2つ両方):

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../../../libs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ../../../libs)

参照

CMakeの処理を切り出す

include(../path/myproject.cmake)

のようにinclude命令を使うと、他の.cmakeファイルに書かれた内容を読み込んで実行できる。

用例:

  • 共通利用する変数を定義する
  • 共通利用するインクルード/ライブラリディレクトリを設定する
  • 共通利用する関数・マクロを定義する

参照

実行ファイルのターゲットプロパティ

Visual C++環境向けに実行ファイルをビルドする場合、

add_executable(exe_name ${sources})

とするとコマンドライン(コンソール)プロジェクトになり、

add_executable(exe_name WIN32 ${sources})

とするとWin32のプロジェクトになる。main()の代わりにWinMain()が呼ばれる。OpenGLプロジェクトはこちら。

XcodeiOS向けのビルドする場合は、以下のようにMACOSX_BUNDLEを付ける。

add_executable(exe_name MACOSX_BUNDLE ${sources})

なお、この設定は変数化できる。

if (WIN32)
  set(exe_mode WIN32)
else ()
  set(exe_mode "")
endif ()

add_executable(exe_name ${exe_mode} ${sources})

参照

リンクディレクトリの指定

CMake 2.8で検証

  • link_directories相対パスを指定するのは廃止された。絶対パスでリンクディレクトリのパスを通す必要がある。
  • link_directories環境変数のパスを使って指定する場合は、link_directories($ENV{MYPROJECT_ROOT}/libs)のように、環境変数$ENV{}で囲んで指定する。