DOAP2023開発日記 #6
Qtプロジェクト
DOAP2023プロジェクトは、サブディレクトリプロジェクト「doap2023」と、その下にサブプロジェクト「doap」を配置する形を取る。
「サブディレクトリプロジェクト」は、Qt Creatorを使用した場合、以下のダイアログで作成するイメージになる。
また、サブプロジェクトになる「doap」は、「C++ Library」プロジェクトとして作成する。
今回はQt Creatorの自動生成機能に頼らずにプロジェクトファイルを作っていく。
ビルドシステムはqmakeを使う
Qtのビルドシステムとして、qmake、CMakeがある(Qbsは2019年にサポートを終了)。最近よく使われるCMakeを使いたいところだが、私の力不足でQt用プロジェクトをCMakeで使いこなすところまでいたっていない。さらにQt用のプロジェクトを取り回すにはまだまだqmakeに一日の長があるらしい。ゆえに今回はqmakeでビルドしていく。
qmake用プロジェクトファイルを作成
VSCodeで、前回作成したdoap2023用ワークスペースを開き、doap2023フォルダの下に「doap2023.pro」ファイルを新規で作成する。
// doap2023/doap2023.pro
TEMPLATE = subdirs
SUBDIRS += \
doap
続いて、doap2023フォルダの下に「doap/doap.pro」ファイルを新規で作成する。
// doap2023/doap/doap.pro
QT -= gui
TEMPLATE = lib
DEFINES += DOAP_LIBRARY
win32: TARGET = ndoap
unix: TARGET = doap
doap/doap_global.h
Qt CreatorでC++ライブラリプロジェクトを作成すると、グローバルヘッダファイルが自動生成される。このヘッダファイルを使うと、関数やクラスなどのエクスポート/インポートを制御できる。
プロジェクト自体を開発している(DOAP_LIBRARYが定義されている)場合、そのシンボルをエクスポートでき、外部から利用している(DOAP_LIBRARYが定義されていない)場合はインポート対象にしてくれる。
このプロジェクトはインポート対象にされることはないが、それにならったヘッダファイルを作成する。ひな形としても有用だと思う。
// doap2023/doap/doap_global.h
#ifndef DOAP_GLOBAL_H
#define DOAP_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(DOAP_LIBRARY)
# define DOAP_EXPORT Q_DECL_EXPORT
#else
# define DOAP_EXPORT Q_DECL_IMPORT
#endif
#endif // DOAP_GLOBAL_H
続いて、最低限の実体コードとしてmain.cppを作成する。今回は、例えDominoサーバにデプロイしてもアドインに失敗するコードを書いておく。
// doap2023/doap/main.cpp
#include "doap_global.h"
#include <dsapi.h>
/**
* @brief フィルターアドインインストール時に呼ばれる関数
* @param pInitData 初期化データ構造体へのポインタ
* @return インストール結果を渡す
*/
extern "C" DOAP_EXPORT unsigned int FilterInit(FilterInitData *pInitData) {
return kFilterNotHandled;
}
そして、作成したヘッダファイル、ソースファイルを利用できるようにプロジェクトファイルに伝える。
// doap2023/doap/doap.pro
# 〜中略〜
HEADERS += \
doap_global.h
SOURCES += \
main.cpp
まとめ
以上で、プロジェクトの最低限の骨格ができた。これまでQt Creatorが自動的にしてくれてたことを、VSCodeは何もしてくれないので、手間は増える。特にヘッダファイルやソースファイルを追加しても、プロジェクトファイルに自動追記はしてくれない。Qtプロジェクト用の拡張機能もありそうだが、疑心暗鬼なところもあって手が出せない。きっとCMakeでQt用のプロジェクトが作れれば、CMake拡張機能でいろいろ補完してくれるのだろう。今のところは、手動で設定することにそこまで手間を感じていないので、いったんこのまま進むことにする。