Firemonkeyで静的ライブラリをリンクする方法
C++ Builderで静的ライブラリをリンクするには幾つかの方法がある。
手軽な方法として自分はいつも#pragma linkを使っていた。
1.#pragmaでリンクする方法
VCLでaaa.libをリンクしようと思ったときには、次のように記述する。
#pragma link "aaa.lib"
ところが、この方法はVCLでかつターゲットプラットフォームが決まっているのであればうまくいくが、FiremonkeyやWin32とWin64を両方コンパイルする場合にはうまくいかず、条件コンパイルをすることになる。
ドキュメントを見ると#pragma link "~"は、省略時の拡張子がobj(Win64ではo)となっているので、静的ライブラリ(Win32でlib、Win64でa)で用いるには適切ではない(できるのだが)だろう。
静的ライブラリのリンクとして適切な方法は#pragma comment()を用いる
#pragma comment(lib,"aaa")
この方法であれば、Win32とWin64で#ifdef _WIN64を用いて条件コンパイルをしなくても両方で適切なライブラリが選択される。
残念なことに、この方法はFiremonkeyではWindowsプラットフォーム(Win32,Win64)でのみ有効となる。その他のプラットフォームでは無視される。
2.プロジェクトに追加してリンクさせる方法
別の方法として、プロジェクトに直接ライブラリを追加する方法がある。
この方法はマルチプラットフォームでもうまくいく。各プラットフォーム用のRelease版とDebug版を全部追加してもリンクできる。
できるのだが適切なライブラリのみがリンクされているのか怪しい。特に同じプラットフォームのRelease版とDebug版を両方リンクしている気がする。真面目にリンクコマンドをトレースすれば判明するかもしれないが、今のところ掘り下げていない。
ただしデバッグでライブラリの中身のトレースを必要としないのであれば、この方法でRelease版のライブラリのみを追加するのも有りだと思う。悩まないで済むし。
3.プロジェクトオプションでライブラリを登録する方法
Firemonkeyでは、別の方法として、ライブラリをオプションで登録することができる。
ただし、この方法で登録できるプラットフォームはiOS 64ビット,macOS,Andoroidのみであることに注意。
プロジェクトオプションの「C++リンカ」→「詳細」→「追加でリンクされるライブラリ」でライブラリ名を登録できる。
aaaと言うライブラリがあればそのままライブラリ名を登録する。
ここで注意するのは、例えばAndroidであれば、aaaと言う静的ライブラリは実体としてlibaaa.aと言うファイル名になるが、libaaa.aと登録するとリンカでそんな名前のライブラリはないとエラーが発生する。
Firemonkeyでマルチプラットフォームの場合どうすべきか
静的ライブラリをRelease版のみ用いることにして、何も考えないのであれば2.の方法をとるのが最も簡単だ。
デバッグ環境も考えたい場合ときは、1と3の方法を両方使う。
あと、ライブラリのサーチパスをプロジェクトオプションに設定するのだが、おすすめは「C++(共有オプション)」でターゲットを「全ての構成-全てのプラットフォーム」にして、ライブラリパスに条件パスを追加する方法だ。ただし共通のベースパスがあって、C++Builderの条件パス設定に準じている場合である。それ以外の場合は個別にパスを追加する。
共通パス\$(Platform)\$(Config)
これを追加することで、プラットフォームとRelease、Debug毎に適切なライブラリファイルをリンクできるようになる。