見出し画像

DOAP2023開発日記 #6

Qtプロジェクト

DOAP2023プロジェクトは、サブディレクトリプロジェクト「doap2023」と、その下にサブプロジェクト「doap」を配置する形を取る。
「サブディレクトリプロジェクト」は、Qt Creatorを使用した場合、以下のダイアログで作成するイメージになる。

サブディレクトリプロジェクト

また、サブプロジェクトになる「doap」は、「C++ Library」プロジェクトとして作成する。

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拡張機能でいろいろ補完してくれるのだろう。今のところは、手動で設定することにそこまで手間を感じていないので、いったんこのまま進むことにする。

この記事が気に入ったらサポートをしてみませんか?