SelectDirectoryでリンカエラー
SelectDirectoryを使うプログラムを書いているとき、リンカエラーを起こすことがある。
どうも、よくわからずいろいろしている内にリンクできてなんとなく放置していた。
今回、C++ Builderが10.3(Rio)になったのので、既存のプログラムをコンバートしてみると、リンカエラー・・・。
[ilink32 エラー] Error: 未解決の外部シンボル '__fastcall Vcl::Filectrl::SelectDirectory(System::UnicodeString, System::WideString, System::UnicodeString&, System::Set<Vcl::Filectrl::TSelectDirExtOpt, 0, 5>, Vcl::Controls::TWinControl *)' が D:\(中略)\WIN32\DEBUG\UNIT1.OBJ から参照されています
他にも、Rioには問題があって、まだ移行はしていないが、導入テストを繰り返していた。
この問題にも腰を据えてかかることにした。サポートさんお世話になりました。
まず、なぜかうまくいったときのプロジェクトと、うまくいかないときのプロジェクトを比較してみた。
そうすると、プロジェクトファイル中の<AllPackageLibs>にvclx.libがあるかないかで決まることがわかった。
プロジェクトファイルの<AllPackageLibs>にvclx.libを追加するとリンクが成功する。
何か環境依存なのか悩んでいたが、フォームにvclx.libを必要とするコンポーネント(TFileListBox)を貼り付けてみてコンパイルしたときに付加されるインクルード文を見て何が問題かが明らかになった。
自動的に付加されるインクルード文は以下の通り
#include <Vcl.FileCtrl.hpp>
Windows環境ではファイル名の大文字小文字は区別されないので、普段はあまり大文字小文字を気にせずインクルード文を書くことが多い。
#include <vcl.filectrl.hpp> // リンカエラー! 大文字小文字が一致しない
こんな風に書いても、コンパイラーは文句を言わない。
しかし、ライブラリのサーチを行うプログラムは大文字小文字を区別するので、上の小文字だけだとライブラリ(この場合はvclx.lib)を追加しないのだ。
ということで、SelectDirectoryでリンカエラーとなる問題に対する解決方法は以下の通り。
「インクルード文を#include <Vcl.FileCtrl.hpp>と大文字小文字を区別して記述する」