NotesとQtでWindows、Mac OS X、Ubuntuのデスクトップアプリ(その10 - 共有ライブラリコンパイル・補足編)

前回は、MacOSX上でコーディングした共有ライブラリのコンパイルを、Qt Creatorで行う場合のqmakeプロジェクトファイルの書き方と、個別環境で指定する「追加の引数」についてお伝えしました。

Qt Creatorのビルド設定について、もう少し補足します。

追加の引数には、qmakeプロジェクトファイルに書くような変数の設定を、ひとくくりの文字列オプションとして指定できます。

"INCLUDEPATH += /My/Original/Include/1 /My/Original/Include/2"

今回のようなマルチプラットフォーム環境でのコンパイルを前提にする場合、qmakeではプロジェクトファイルに「win32:」「macx:」「unix:」のようなプラットフォーム別プリフィックスを使うこともできます。

macx:INCLUDEPATH += /My/Original/Include/1 /My/Original/Include/2

ですので、GitHubのような公開リポジトリを気にする必要がなければ、直接プロジェクトファイルにINCLUDEPATHやLIBSで個別環境の情報記述してしまってもいいでしょう。

win32:INCLUDEPATH += C:/Users/User01/MyWinLib/include
else:macx:INCLUDEPATH += /Users/User01/MyMacLib/include
else:unix:INCLUDEPATH += /home/User01/MyLinuxLib/include

また、Qt Creatorのビルド設定には、一時的に環境変数を変更する機能があります。実環境の変数は汚したくないけど、ビルド時にどうしても環境変数を追加、変更、削除したいことはままあります。そんな時は、「ビルド時の環境変数」を修正すればOKです。実環境を汚すことなくビルド時のみの環境変数を設定することができます。

次に、Notes C API Toolkitへのパスについてです。

API Toolkitは以下のようなフォルダ構成になっています。

cmp      コンパイラオプションの指定サンプル
doc      ヘルプデータベース
include  ヘッダファイル
lib      共有オブジェクト、共有ライブラリ
notedata サンプルで使用するNotesデータベース
samples  サンプルコード

includeに含まれるヘッダーファイルは、各プラットフォーム共通です。

プロジェクトファイルには、INCLUDEPATHに「+=」で追記します。

libに含まれるのは、NotesMainというエントリポイントを使いたいクライアントプログラム用の「notes0オブジェクトファイル」、AddInMainというエントリポイントを使ったサーバータスクプログラム用の「notesai0オブジェクトファイル」が、各プラットフォームごとに用意されています。Windowsのみ、notes.dllへのスタブとなるインポートライブラリ「notes.lib」も提供されています。MacOSXLinuxは、直接プラットフォーム上にインストールされているNotes共有ライブラリへのパスを指定すればリンクできます。

プロジェクトファイルには、LIBSに「+=」で、「-L」(大文字のエル)を頭に付けてパスを指定します。ライブラリの本体名は、「-l」(小文字のエル)を頭に付けます。

LIBS += -L'/Applications/IBM Notes.app/Contents/MacOS'"
LIBS += -lnotes

共有ライブラリは、各OSごとに呼び名や命名規約が異なります。以下は各OSごとのNotes共有ライブラリですが、いずれの場合も「-lnotes」と指定すればOKです。

Windows: nnotes.dll(notes.lib)
Mac: libnotes.dylib
Linux(Ubuntu): libnotes.so

最後に各OS固有のビルド設定における違いを示します。

Windows

Windowsは、コンパイルにおいて構造体のアラインメントに気を配る必要があります。Statusクラスの紹介記事でも書きましたが、#pragma pack(push, 1)で1バイトに変更した上で、Notesヘッダーファイルをインクルードし、#pragma pack(pop)で元に戻す作業が必要になります。

あとは、前述の通り、リンク先は直接nnotes.dllを見に行くのではなく、ツールキット内のインポートライブラリでリンクを済ませます。nnotes.dllとの実際のリンクは、実行時にPATHで検索することになります。

環境変数については特に何もしません。

MacOSX

経験上ですが、Macの場合、追加の引数に共有ライブラリへのパスを指定するだけではビルドできませんでした。Qt Creatorの「ビルド設定」内にある「ビルド時の環境変数」というところで、DYLD_LIBRARY_PATHという環境変数に、Notesライブラリまでのパスを追加(なければ作成)します。また、Notes共有ライブラリへのパスには、スペースが含まれていることに注意します。

# 追加の場合
DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:`/Applications/IBM Notes.app/Contents/MacOS/`

# 変数がなければ変数自体を追加
DYLD_LIBRARY_PATH=/Applications/IBM Notes.app/Contents/MacOS/
Linux(Ubuntu)

これも経験上編み出したんですが、実のところ理由がよくわかりません。LIBSに追加する共有ライブラリへのパスは「-L〜」のみではビルドできません。Macの「DYLD_LIBRARY_PATH」のようなものなのでしょうか、以下のような指定が必要です。

# これだけではリンクできませんでした。
LIBS += -L/opt/ibm/notes

# こうするとリンクできました。
LIBS += -L/opt/ibm/notes -Wl,-rpath,/opt/ibm/notes

なお、環境変数については特に何もしません。