MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの設定 - CMakeのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの設定 - CMake
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == CMakeは、アメリカ国立医学図書館の出資により医療系画像解析に利用されるITK(Insight Toolkit)のために開発されたクロスプラットフォーム向けのメタビルドシステムであり、<br> qmakeと同様、クロスプラットフォーム向けに各種ビルドシステムのためのレシピファイルを生成する。<br> qmakeがQtのために開発されているのに対して、CMakeはITKのためにと開発されたが、メタビルドシステムとして独立のオープンソースプロジェクトとして単独で提供されている。<br> <br> このため、KDE、LLVM、OpenCVをはじめ多数のプロジェクトで採用されている。<br> <br> CMakeは、主に、C/C++等のプログラム言語のビルドに使用される。<br> CMakeが存在する以前では、C系言語のビルドには多数のビルドシステム(MakefileやNinjaやIDE等)が乱立していた。<br> これを隠蔽して、包括的に扱える様にしたものがCMakeである。<br> <br> また、CMakeには、CUI版とGUI版が存在する。<br> <br> CMakeは、変数、コマンド、マクロ、条件論理、ループ、コメント等の開発者にとって馴染みのある多くのものを備えている。<br> CMakeで使用されるコマンド名も大文字小文字を区別しないため、以下は全て等価である。<br> ただし、最近では、コマンド名を全て小文字で記述することが一般的である。(これは、CMakeのドキュメントでビルトインコマンドのために従われている慣習でもある)<br> <syntaxhighlight lang="cmake"> add_executable(myExe main.cpp) ADD_EXECUTABLE(myExe main.cpp) Add_Executable(myExe main.cpp) </syntaxhighlight> <br><br> == 非推奨のコマンドおよび設定 == * include_directoriesコマンド *: 指定したディレクトリからヘッダファイルを検索するコマンドである。 *: 定義した箇所以降の全てのターゲットが指定したディレクトリをインクルードするため、使用は避けるべきである。 *: 代わりに、<code>target_include_directories</code>コマンドを使用する必要がある。 <br> * add_definitionsコマンド ** プロジェクト全体に影響を与えてしまう。 ** ビルド依存性の管理が難しくなる。 ** コンパイラの最適化を阻害する可能性がある。 *: 代わりに、<code>target_compile_definitions</code>コマンドを使用する必要がある。 <br> * add_compile_definitionsコマンド ** プロジェクト全体への影響 **: プロジェクト内の全てのターゲットに対して定義を追加される。 **: これにより、意図しないターゲットにまで定義が設定されてしまう可能性がある。 ** ビルド依存性の管理が難しくなる **: 特定のターゲットにのみ必要な定義がプロジェクト全体に設定されると、ビルド依存性の管理が複雑になる。 ** コンパイラの最適化への影響 **: 不要な定義が設定されると、コンパイラの最適化が阻害される可能性がある。 *: 代わりに、<code>target_compile_definitions</code>コマンドを使用する必要がある。 <br> * add_compile_optionsコマンド *: プロジェクト全体に対してコンパイルオプションを設定してしまうため、以下に示すような問題が発生する可能性がある。 ** 意図しないターゲットへの影響 **: プロジェクト内の全てのターゲットに対してコンパイルオプションが設定されるため、意図しないターゲットにも影響を及ぼす。 ** ビルド依存性の管理が難しくなる **: 特定のターゲットにのみ必要なコンパイルオプションがプロジェクト全体に設定されると、ビルド依存性の管理が複雑になる。 ** コンパイラの最適化への影響 **: 不要なコンパイルオプションが設定されると、コンパイラの最適化が阻害される可能性がある。 *: 代わりに、<code>target_compile_options</code>コマンドを使用する必要がある。 <br> * link_directoriesコマンド *: プロジェクト内の全てのターゲットに対してリンクディレクトリを追加するため、以下に示すような問題が発生する可能性がある。 ** プロジェクト全体への影響 **: 意図しないターゲットにもリンクディレクトリが設定される可能性がある。 ** ビルド依存性の管理が難しくなる **: 特定のターゲットにのみ必要なリンクディレクトリがプロジェクト全体に設定されると、ビルド依存性の管理が複雑になる。 ** リンク順序の問題 **: このコマンドで追加したディレクトリは、自動的にコマンドラインのリンカ引数の最後に追加される。 **: これにより、リンク順序に関する問題が発生する可能性がある。 *: 代わりに、<code>target_link_libraries</code>コマンドを使用する必要がある。 <br> * link_librariesコマンド *: プロジェクト内の全てのターゲットに対してリンクライブラリを追加するため、以下に示すような問題が発生する可能性がある。 ** プロジェクト全体への影響 **: 意図しないターゲットにもリンクライブラリが設定される可能性がある。 ** ビルド依存性の管理が難しくなる **: 例えば、特定のターゲットにのみ必要なライブラリがプロジェクト全体にリンクされると、ビルド依存性の管理が複雑になる。 ** リンク順序の問題 **: このコマンドで追加したライブラリは、自動的にコマンドラインのリンカ引数の最後に追加される。 **: これにより、リンク順序に関する問題が発生する可能性がある。 *: 代わりに、<code>target_link_libraries</code>コマンドを使用する必要がある。 <br> * キャッシュ変数には、必ず接頭辞を付加する *: キャッシュ変数はグローバル変数であるため、名前の衝突を避けるために接頭辞を付加する。 <br> * 変数CMAKE_<LANG>_FLAGS *: 代わりに、<code>target_compile_options</code>を使用する。 *: <code>target_compile_options(<ターゲット名> PUBLIC -Wall)</code> <br> * 変数<code>CMAKE_CXX_FLAGS</code>や<code>target_compile_options</code>コマンドに、<code>-std=c++17</code>等を指定しない。 *: 変数<code>CMAKE_CXX_STANDARD</code>を使用する(CMake 3.1以降)、または、<code>target_compile_features</code>コマンドに<code>cxx_std_17</code>を指定する。(CMake 3.8以降) <br> * 変数CMAKE_SOURCE_DIRを使用しない *: 変数<code>CMAKE_SOURCE_DIR</code>は、トップレベルのディレクトリを指す。 *: 異なるプロジェクトがネストしている場合、自身のプロジェクトのルートディレクトリ以外のパスを指すため、使用すべきでない。 *: 代わりに、変数<code>CMAKE_CURRENT_SOURCE_DIR</code>、変数<code>PROJECT_SOURCE_DIR</code>、変数<code><プロジェクト名>_SOURCE_DIR</code>を使用する。 <br> * macroコマンドの代わりにfunctionコマンドを使用する *: <code>function</code>コマンドは、関数を定義するためのコマンドである。 *: <code>macro</code>コマンドは、呼び出す側のスコープにある変数を上書きするため、自身のスコープを持つ<code>function</code>コマンドを使用する。 *: 親ディレクトリのスコープにある変数を上書きする場合は、<code>set(<変数名> <値> ... PARENT_SCOPE)</code>コマンドを使用する。 <br> * file(GLOB)コマンド *: <code>file(GLOB)</code>コマンドは、CMakeを実行するたびに条件に合致するファイルのリストを自動的に作成するコマンドである。 *: ただし、特定のIDEでは正常に動作しない可能性があるため、コマンドラインから実行するような場合ではない限り使用すべきではない。 *: IDEで使用する場合は、CMakeLists.txtファイルに<code>add_subdirectory</code>コマンドと<code>target_sources</code>コマンドを使用して、再帰的にファイルを明示して追加する。 <syntaxhighlight lang="cmake"> # CMakeLists.txtファイル add_executable(<ターゲット名>) add_subdirectory(<ディレクトリ名1>) add_subdirectory(<ディレクトリ名2>) # 同様に子ディレクトリを追加する </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> # <ディレクトリ名1>/CMakeLists.txtファイル # CMake 3.12以前 target_sources(<ターゲット名> PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp # 絶対パスで指定しないとエラーになるため注意すること ) # CMake 3.13以降 cmake_policy(SET CMP0076 NEW) # CMakeが自動的に相対パスを絶対パスへ変換する target_sources(<ターゲット名> PRIVATE file1.cpp file2.cpp ) </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> # 画像ファイルの取得 (PNG, JPG, SVG) execute_process( COMMAND find ${CMAKE_CURRENT_SOURCE_DIR}/Image -iname "*.png" -o -iname "*.jpg" -o -iname "*.svg" OUTPUT_VARIABLE IMAGES ) string(REPLACE "\n" ";" IMAGE_FILES "${IMAGES}") </syntaxhighlight> <br> * <code>PRIVATE</code>オプション、<code>PUBLIC</code>オプション、<code>INTERFACE</code>オプションを適切に使用する。 *: これらのオプションは、コマンドのターゲットおよびそのターゲットに依存するターゲットに対する必要性を表す。 *: ヘッダファイルのみのライブラリの場合は、<code>INTERFACE</code>オプションを使用する。 <center> {| class="wikitable" | style="background-color:#fefefe;text-align: center;" |- ! style="background-color:#66CCFF;" | オプション ! style="background-color:#66CCFF;" | ターゲットが必要とする ! style="background-color:#66CCFF;" | ターゲットに依存するターゲットが必要とする |- | PRIVATE || ○ || ☓ |- | PUBLIC || ○ || ○ |- | INTERFACE || ☓ || ○ |} </center> <br> * ライブラリの種類を指定しない *: ビルドするユーザがスタティックライブラリまたはダイナミックライブラリを指定できるようにする。 *: <code>BUILD_SHARED_LIBS</code>オプションを付加して選択することもできるが、各ライブラリごとにオプションを設定すべきである。 <syntaxhighlight lang="cmake"> option(<変数名1> "build library as a shared library" ON) if(<変数名1>) add_library(<ターゲット名> SHARED) else() add_library(<ターゲット名> STATIC) endif() </syntaxhighlight> <br><br> == CMakeとqmakeの特徴 == <center> {| class="wikitable" | style="background-color:#fefefe;" |- ! style="background-color:#66CCFF;width: 30%;" | ! style="background-color:#66CCFF;width: 35%;" | qmake ! style="background-color:#66CCFF;width: 35%;" | CMake |- | レシピファイル || <Qtプロジェクト名>.pro || CMakeLists.txt |- | レシピの呼び方 || プロジェクトファイル || CMakeソースコード |- | 特徴 || 変数ベース || コマンドベース |- | ターゲット || 1ファイル 1ターゲット || 1ファイル 複数ターゲット |- | プロジェクト間の連携 || 不可 || ターゲット名でリンク可能 |- | Qtのサポート || ◎ || ○ |- | Qt Creatorの対応 || ◎ || ファイルの追加等の対応がイマイチ |- | カスタムコンパイラの対応 || △ || ◎ |- | Packageの作成 || △ || ○ |} </center> <br> ==== レシピファイルの違い ==== qmakeとCMakeは、レシピの考え方が異なる。<br> qmakeは、変数<code>SOURCES</code>等のような変数に適切な値を設定していくことにより、対応するアーキテクチャの設定ファイル等から取得した値を使用して、<br> MakefileやVisual Studio / XCode向けのプロジェクトファイルを生成する。<br> CMakeは、コマンドと呼ばれる関数の引数に、ターゲットの情報、Define情報、インクルードパス等をプログラムして、Makefileや各種プロジェクトファイルを生成する。<br> <syntaxhighlight lang="cmake"> # qmakeの場合 TEMPLATE = app CONFIG -= qt # Qtライブラリを使用しない場合は、変数CONFIGからqtを削除する SOURCES = main.cpp # CMakeの場合 cmake_minimum_required(VERSION 3.15) project(HelloWorld LANGUAGES CXX) add_executable(helloworld main.cpp) </syntaxhighlight> <br> 以下の例は、Qt Coreライブラリのみを使用するQtソフトウェアにおける最低限のレシピファイルである。<br> <br> CMakeは汎用的なツールのため、Qtライブラリを使用する場合、CMakeのコマンド量が増加する。<br> <code>find_package</code>関数を使用してQtライブラリ全体からQt Coreライブラリを要求することにより、<br> Qt Coreライブラリを変数Qt5::Core(Qt6では、Qt6::Coreとなる)経由で、<code>target_link_libraries</code>に指定してリンクを指示する。<br> <syntaxhighlight lang="cmake"> # qmakeの場合 TEMPLATE = app QT -= gui # qmakeの初期状態はGUIが有効なため、変数QTからguiを削除することにより、Qt Coreライブラリのみとなる SOURCES = main.cpp hello.cpp HEADERS = hello.h # CMakeの場合 cmake_minimum_required(VERSION 3.15) project(HelloWorld LANGUAGES CXX) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(Qt5 COMPONENTS Core REQUIRED) add_executable(helloworld main.cpp hello.cpp hello.h ) target_link_libraries(helloworld Qt5::Core ) </syntaxhighlight> <br> ==== 共通の機能 ==== * サブディレクトリ(サブプロジェクト)に対応 * ファイルの読み書き * 独自関数の定義 * 別ファイルに分割したレシピをインクルードできる * 自動的にmocを呼び出す * Qtのリソースファイル対応 * インストールの定義 * 繰り返し文や条件分岐文 * プラットフォームの判定 * インストール * テストの設定および実行 * 追加機能およびモジュール等の提供 <br> CMakeの強みは、カスタムコンパイラ、機能の拡張性、パッケージ作成まで行う機能が提供されていることである。<br> qmakeでは、QTestによりテストの設定および実行もできるが、ビルドを補助するツールとしての特色が強い。<br> CMakeでは、CTest、CPack等の機能により、テストやパッケージ作成も可能である。<br> <br> qmakeもCMakeも制御構文を持ち複雑なプロジェクトの作成も可能であるが、プロジェクトでの採用検討という視点から将来性も含めて考慮した場合、CMakeの方が有力である。<br> <br><br> == qt5_create_translation == TSファイルやTSファイルがあるディレクトリを指定して、Qt LinguistからTSファイルを生成する。<br> TSファイルは、ビルドディレクトリに保存される同じベースネームのQMファイルにコンパイルされる。<br> <br> 生成されたQMファイルへのパスは、<変数名>に追加される。<br> <br> 作成または更新する翻訳ファイルの拡張子は<code>.ts</code>である必要がある。<br> 与えられたTSファイルのパスが相対パスの場合、現在のプロジェクトのトップディレクトリからの相対パスで解決される。<br> <br> TSファイルが存在しない場合、<code>qt5_create_translation</code>は何もしない。<br> <br> <code>lupdate</code>コマンドは、ソースファイルまたはディレクトリを入力として受け付ける。<br> <オプション>は、<code>lupdate</code>コマンドの実行時に使用するオプションを指定することができる。<br> 指定可能なオプションは、[[Qtの設定 - Qt Linguist#lupdateコマンド]]を参照すること。<br> <syntaxhighlight lang="cmake"> qt5_create_translation(<変数名> <TSファイル 1> <TSファイル 2> <TSファイル 3> ... <オプション>) # 例. # まず、プロジェクトのトップディレクトリにあるTSファイルを検索する。(helloworld_en.tsファイルとhelloworld_ja.tsファイル) # 次に、lupdateコマンドを実行してTSファイルをコンパイルすることにより、helloworld_en.qmファイルとhelloworld.ja.qmファイルを生成または更新する。 qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} helloworld_en.ts helloworld_de.ts) </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの設定 - CMake
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse