Notes C API & C++11+ & ReactiveX & Qt #3

ここでは、チュートリアルとして簡単なコマンドラインアプリを作り、Notes C APIの基礎を勉強していきます。C/C++C++11以降の仕様、ReactiveX/C++、Qtフレームワークについては、必要に応じて触れていきます。

以降の前提条件として、以下のような要件で進めていきます。

教材は、GitHubにアップしているものを使うので、こちらからソースコードをクローン/プルして、記事ごとにタグをチェックアウトして下さい。

# クローンの作成
> git clone https://github.com/Chiburu/ncl
> cd ncl

今回は、タグ「v0.0.1」を使います。

# タグ「v0.0.1」をチェックアウト
> git checkout v0.0.1

ソースコードが更新されたら、次のようにローカルもアップデートします。

# ローカルリポジトリをリモートリポジトリに合わせる
> git pull origin master

v0.0.1では、一つのNotes C API関数を実行するために、コンパイル、リンクではどんな準備が必要かを見ていきます。

QtはC++のライブラリフレームワークです。

www.qt.io

オープンソース版であれば、無償で利用できます。

Qtの最大の特徴は、PC(Windows/Mac/Linux)のデスクトップアプリケーションを同じソースコードからビルドできるところでしょう。その点、マルチプラットフォームアプリケーションであるNotesととても相性がいいと言えます。事実、昨年までの私の記事でも、3つの環境のアプリを同一ソースから作成していました(※ とある事情でMacのNotesが使えなくなり、UbuntuではNotes C APIの都合でC++11未対応のgccしか使えず、現在はWindowsオンリーという状況です)。

C++マルチプラットフォームアプリケーションが開発できる秘密は、Qtプロジェクトファイル(.pro)と、QMakeというコマンドツールです。Qtプロジェクトファイルは、コンパイル、リンクに関わる設定の他に、プラットフォームごとに必要な準備設定をし、それをQMakeがそれを読み取って、プラットフォームごとのコンパイラ、リンカが動作するのに必要な準備を実施します。

# ncl.pro(Qtプロジェクトファイル)
QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

# ===== ここまでQtコンソールアプリケーションの既定値 =====

# アプリケーション説明
QMAKE_TARGET_PRODUCT = Notes Commandline
QMAKE_TARGET_DESCRIPTION = Notes Commandline Tool
QMAKE_TARGET_COPYRIGHT = (c) Chiburu Systems

# バージョン設定
VERSION = 0.0.1

# 翻訳ファイル
TRANSLATIONS += ncl.ja_JP.ts

# Notes C APIのインストール先(区切りはWindowsでもスラッシュ)
NOTES_C_API_DIR = Z:/Users/Shared/notesapi

# Notes C APIのインクルードファイルの場所
INCLUDEPATH += $$NOTES_C_API_DIR/include
DEPENDPATH += $$NOTES_C_API_DIR/include

# Windowsの場合
win32 {
  # Windowsに必要なシンボル
  DEFINES += W W32 NT
  # 不要な警告を非表示
  QMAKE_CXXFLAGS += -wd4503 -wd4005
  # 64ビット版
  contains(QMAKE_TARGET.arch, x86_64) {
    DEFINES += W64 ND64 _AMD64_
    LIBS += -L$$NOTES_C_API_DIR/lib/mswin64/
  }
  # 32ビット版
  else {
    LIBS += -L$$NOTES_C_API_DIR/lib/mswin32/
  }
}

# OS共通のリンクライブラリ
LIBS += -lnotes

DISTFILES += \
    ncl.ja_JP.ts \
    Readme.md

RESOURCES += \
    ncl.qrc

この中で、特にNotes C APIに関わってくるところとして、以下のような記述箇所があります。

DEFINES += W W32 NT

「DEFINES」は、ソースコードに#defineシグネチャを追加する、コンパイラの-Dオプションのようなものです。Notes C APIはプラットフォームごとに必要なシグネチャがあり、Windowsの場合はこの「W」「W32」「NT」というシグネチャを、ヘッダファイルを読み込む前に定義しておく必要があります。64ビットWindowsのDominoの場合は、さらに「W64 ND64 AMD64」を追加する必要があります。(続く)