過去のバージョンで作成したプロジェクトをC++Builder XE3に移植する場合、プログラムやプロジェクトに何の問題もないにもかかわらず、「未解決の外部シンボル ‘symbol’ が ‘module’ から参照されています」という原因不明のリンカエラーが発生して悩まされるケースに何度も直面しました。これは関数の本体が定義されていなかったり、ライブラリのリンクを忘れている場合に頻繁に起こり得るエラーですが、すでにビルドが完了しているプロジェクトであればそのようなことは起こらないはずです。しかしどうやっても上記のエラーが取れず、途方に暮れてしまったことがありました。
エラーメッセージから、その「未定義の外部シンボル」が何なのかを探ると、どうやらフォームに貼り付けているビジュアルなコンポーネントのメソッドやプロパティであることがほとんどです。少なくとも自分で定義したメソッド類ではありません。VCLに含まれるコンポーネントは自動的にリンクされているはずですから、基本的にそのようなエラーは起こりようがないのです。しかもすべてのコンポーネントがエラーになるわけではなく、ごく一部の限られたコンポーネントだけで発生するのですから、ますますわけがわかりません。
これには本当に頭を抱えてしまい、一日考えてもわからなかったのでギブアップしたのですが、次の日もう一度やってみると、なぜかいつの間にか直っていました(笑)。本当に何も修正していないのですから、原因がわからないと余計に気持ち悪くなります。その時は「偶然」直ったとしか思えなかったのですが、その後も同じエラーに遭遇するにつれて一つの法則が見えてきました。その対処方法は次のようなものです。
「未解決の外部シンボル ‘symbol’ が ‘module’ から参照されています」のリンカエラーが発生した場合、その’symbol’を含むコンポーネントが貼り付けられているファイルを開き、「デザイン」タブに切り替えます。その上でもう一度ビルドしてみると、あら不思議!(笑)、今度はエラーが消えているのです。なぜそうなるのか理屈はまったくわかりません。しかしこれですべてリンカエラーは解決しました。
一度デザイナを開いてやるだけで直るというのはまったく不可解で、バグに近いものなのかもしれませんが、悩んでどうしようもなくなったときはやってみることをおすすめします。理由がわからないのは何とも腑に落ちないですが、C++Builderはたまにこういうことがありますね・・
コメント