奈良県でソフトウェア開発・Webサイトの運営をしているフリーランスのエンジニアです

ロジカルアーツ研究所

C++Builder

C++Builder XE3で条件定義'NO_STRICT'を使うとリンカエラーになる

投稿日:2012年12月7日 更新日:

C++Builder 2009で作成したプロジェクトをXE3に移植する作業をしていたのですが、例によってすんなりとは行ってくれません。バージョン2009以降、プロジェクトレベルでの互換性は保たれており、プロジェクトの変換なしで読み込むことはできるのですが、当然のようにコンパイルエラーの嵐でした。前の記事でも書きましたが、t_str()の仕様が変わっていたり、ちょっとしたことでコンパイルが通らなくなるのですね。それらを一つ一つ地道に潰しながら、いよいよコンパイルエラーが全部取れて最終リンクまで進んだとき、今度は原因不明のリンカエラーが発生して行き詰まってしまいました。

そのエラー内容は、「未解決の外部シンボル 'symbol' が 'module' から参照されています」というもので、これ自体はよく目にするものです。これは主に呼び出している関数やメソッドの本体が定義されていないために起こるものですが、どういうわけかTRegistryのRootKeyプロパティにアクセスした場合にだけ起こるのです。試しにこのメソッドをコメントアウトしてみるとエラーは起こりません。しかし、当然これはVCLのクラスですから、ちゃんと Registry.hpp さえインクルードしていれば何の問題も起こらないはずです。実際、新規プロジェクトを作成してクリーンな状態でTRegistryのRootKeyプロパティにアクセスするサンプルを書いてみても、リンカエラーは起こりません。だから少なくともXE3のバグではないはずです。

この問題には本当に頭を抱えて、丸2日間も潰してしまいました(苦笑)。どう考えても間違ってはいない・・。それで、こういうときはいったん頭をリセットして、まったくクリーンな状態でTRegistryを使ったサンプルを書き、そこから少しずつ既存のプロジェクトで使っている設定を加えていって、いつエラーが発生するのかを検証してみました。するとプロジェクトオプションの条件定義で'NO_STRICT'を加えるとリンカエラーになることを突き止めたのでした。なぜそうなるのかはまったくわかりませんが、これだけのことに気づくのに丸2日を要しました(笑)。このNO_STRICTという条件定義はC++Builder 2009ではプロジェクトのデフォルトになっており、そこから引き継いだプロジェクトには必ず入っていたのでした。しかしXE3ではこの条件定義はデフォルトから外れており、だから問題なく通ったのですね。

本当に行き詰まったときは、遠回りに思えてもまっさらな状態から一つ一つ積み上げていくのが一番確実な解決方法だということを思い知りました。プロジェクトを移植するときは、既存のものをそのまま読み込むのではなく、できるだけ新規に作成してモジュールを追加していくのが確実であるといえます。

-C++Builder

Copyright© ロジカルアーツ研究所 , 2024 All Rights Reserved Powered by STINGER.