この記事はCMakeの基本的な使い方をある程度把握しており、
CMakeを使用してQtアプリケーション作成したい人を対象としています。
今回はQt5.6、CMake3.5を使用しました。
プロジェクト名とアプリのバージョンを設定する
cmake_minimum_required(VERSION 3.0)
project(MinimalQtApp VERSION 0.0.1)
cmake_minimum_required()
でCMake
のバージョンを指定します。
project()
で作成するアプリ名とバージョンを指定します。
CMake3.0
からVERSION *.*.*
と書くことでバージョンナンバーを指定できるようになりました。
QTDIRを指定する
set(QTDIR $ENV{QTDIR})
set(CMAKE_PREFIX_PATH ${QTDIR})
後に登場しますがfind_package(Qt5...)
という構文で自動でQtライブラリをサーチすることができます。
このfind_package(Qt5...)
という構文でライブラリをサーチするためには、QTDIR
にQtライブラリのルートディレクトリを設定する必要がありますのでここでセットしておきます。
QTDIR
はシステムの環境変数に登録しておくかプロジェクトの環境変数として登録しておくのが良いでしょう。
Qtライブラリをプロジェクトに追加する
find_package(Qt5Widgets REQUIRED)
︙
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
Qtライブラリをプロジェクトに追加するにはfind_package()
でQtライブラリを探してきてtarget_link_libraries()
を使用してアプリケーションにリンクします。
上記の例ではWidgets
しか指定していませんが、Widgets
の依存しているCore
やGui
も自動でリンク対象になります。
uiファイルを処理する
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
︙
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
qt5_wrap_ui(UI_HEADERS ${UI_SOURCES})
GUIアプリケーションを作成する際には多くの場合.ui
を用いてレイアウトを作成することになると思います。
CMakeにはqt5_wrap_ui()
という.ui
ファイルをコンパイル可能なヘッダに変換してくれる便利な関数がありますのでこれを利用します。
この関数を利用するにはCMAKE_INCLUDE_CURRENT_DIR
とCMAKE_AUTOMOC
をON
に設定します。
ヘッダファイルはビルドディレクトリに出力されますので${CMAKE_CURRENT_SOURCE_DIR}
と${CMAKE_CURRENT_BINARY_DIR}
をインクルードディレクトリに追加してあげることで、生成されたヘッダファイルをプロジェクトが見つけることができるようになります。
アイコンを同梱する
if(WIN32)
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.rc)
elseif(APPLE)
set(MACOSX_BUNDLE_ICON icon.icns)
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.icns)
set_source_files_properties(${APP_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
endif()
if(WIN32)
set(APP_BUNDLE WIN32)
elseif(APPLE)
set(APP_BUNDLE MACOSX_BUNDLE)
endif()
add_executable(${PROJECT_NAME} ${APP_BUNDLE} ${APP_ICON} ${SOURCES} ${HEADERS} ${UI_HEADERS})
if(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/AppleInfo.plist)
endif()
Windowsの場合はバンドルタイプをWIN32
に指定し、用意した.ico``.rc
ファイルの.rc
ファイルの方をアプリケーションに追加することでアイコンを登録できます。
Macの場合はバンドルタイプを指定しアイコンをアプリケーションに追加するところまではWindowsと同じですが、それプラスAppleInfo.plist
を作成してset_target_properties()
でアプリケーションに登録する必要があります。
この設定ファイルはCMake同梱のものがありますのでそちらを参考に作成すると良いでしょう。
HiDPI対応する(Macのみ)
<key>NSHighResolutionCapable</key>
<true/>
Macの場合はHiDPI対応も視野に入れる必要があります。
HiDPIに対応するためには前述のAppleInfo.plist
にNSHighResolutionCapable true
を追加してあげるとことでHiDPIモードでアプリが起動するようになります。
Qt5.5までのバージョンではそれプラスQApplication
に明示的にQt::AA_UseHighDpiPixmaps
を指定する必要がありました。
パッケージをデプロイする
【Windows】
windeployqt.exe MinimalQtApp.exe
【Mac】
macdeployqt MinimalQtApp.app
Qt同梱のwindeployqt
やmacdeployqt
などのコマンドを使用すると依存ライブラリを実行ファイルのあるディレクトリまでコピーしてくれます。
但しwindeployqt
はQtライブラリ以外の依存関係は解決してくれませんので、Qt以外のライブラリは自分でコピーすることになります。
macdeployqt
も依存関係が解決できない場合がありますのでその場合はinstall_name_tool
を使用して自分で依存関係を解決する必要があります。
今回はハマりそうな部分だけを書きましたが、
こちらにサンプルプロジェクトが置いてありますのでご参考にどうぞ!
それでは素敵なQtライフを!
追記
uiファイルの処理について (2016年3月31日)
CMake3.0からCMAKE_AUTOUIC
をON
にして.ui
ファイルをadd_executable()
に渡すとqt5_wrap_ui()
を使用せずとも自動でヘッダファイルを作成してくれるようです。
cmake_minimum_required(VERSION 3.0)
︙
set(CMAKE_AUTOUIC ON)
︙
add_executable(${PROJECT_NAME} ${APP_BUNDLE} ${APP_ICON} ${SOURCES} ${HEADERS} ${UI_SOURCES})
shibukawaさん情報ありがとうございました!