Notes C API & C++11+ & ReactiveX & Qt #3
ここでは、チュートリアルとして簡単なコマンドラインアプリを作り、Notes C APIの基礎を勉強していきます。C/C++、C++11以降の仕様、ReactiveX/C++、Qtフレームワークについては、必要に応じて触れていきます。
以降の前提条件として、以下のような要件で進めていきます。
OS: Windows 10
コンパイラ: Visual Studio 2015
Qt: 5.9.3 MSVC2015 32bit
NotesクライアントおよびC API Toolkit: 9.0.1
教材は、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の最大の特徴は、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」を追加する必要があります。(続く)