Classic および Clang C++ Win 32 コンパイラで記述されたコンポーネントまたはライブラリをパッケージしています
コンポーネント開発者ガイド:インデックス への移動
2 つのWin32 コンパイラ(Classic (bcc32)および Clang 拡張(bcc32c/x))でビルドされたオブジェクトは、お互い互換性がありません。 これらはバイナリレベルで非互換です。 異なるコンパイラで一緒にビルドされた実行可能ファイルまたは静的ライブラリといった、バイナリまたはオブジェクトをリンクしようとすると、リンク時または実行時に、数多くのエラーが発生する可能性があります。 リンカは、この状況の検知を試み、警告メッセージを表示します。
覚えておいてください。開発者は、Classic でコンパイラされたコードを、Clang でコンパイルされたコードに対してリンクしてはならず、また逆も同様です。 ライブラリ ベンダーは、Win32 に対してライブラリ バイナリを 2 つのバージョン配信しなければなりません。 また、アプリケーション開発者は、一緒にリンクされるライブラリはすべて同じコンパイラでビルドされたものであるか確認する必要があります。
Classic および Clang は両方とも、Win32 に対して Delphi で生成されたオブジェクト ファイルに対応しています。しかしながら、Classic と Clang はお互いに互換性がありません。
目次
コンパイラ不一致を示すエラー メッセージ
- 一緒にリンクされたオブジェクト ファイル群に使用されているコンパイラが異なる場合、リンカは次の警告を発します:
Warning: Compiler mismatch. Module ‘foo.lib|bar’ built with the [classic|clang-based] compiler; expected the [clang-based|classic] compiler because of ‘xyzzy.obj’
例:
Warning: Compiler mismatch. Module ‘foo.lib|bar’ built with the classic compiler; expected the clang-based compiler because of ‘xyzzy.obj’
この警告は、ライブラリ 'foo.lib' に含まれるオブジェクト ファイル 'bar' が、想定外のコンパイラ(この場合、Classic コンパイラ)でビルドされていると告げています。 リンカは、自分がすでに処理したオブジェクト ファイル xyzzy.obj が Clang コンパイラだったため、それを想定しています。
C++Builder 10.3.3 以前のエラー メッセージ
CBuilder の以前のバージョンで、リンカ コンパイラ検知が C++Builder 10.3.3 に追加される前は、次のエラー メッセージが典型的なコンパイラ不一致を示唆するものでした。
- Clang ツールチェーンでビルドされたアプリケーションが、クラッシックでビルドされたライブラリに対してリンクされると、次のエラーが表示されます:
[ilink32 Error] Error: Unresolved external '__InitExceptBlockLDTC' [ilink32 Error] Error: Unresolved external '_ThrowExceptionLDTC' Error: Unresolved external '_CatchCleanup()'
- Classic ツールチェーンでビルドされたアプリケーションが、Clang でビルドされたライブラリに対してリンクされると、次のエラーが表示されます:
Error: Unresolved external '___seh_personality_v0' Error: Unresolved external '__Unwind_SjLj_Register' Error: Unresolved external 'std::_Xbad_alloc()' Error: Unresolved external '___cxa_begin_catch' Error: Unresolved external '___cxa_rethrow' Error: Unresolved external '___cxa_end_catch' Error: Unresolved external '__Unwind_SjLj_Unregister' Error: Unresolved external '__Unwind_Resume' Error: Unresolved external '___cpp_terminate'
アプリケーション開発者の Clang バイナリまたは Classic バイナリの利用
アプリケーションをビルドする際、リンク付けされるすべてのバイナリが、Clang 拡張コンパイラまたは Classic コンパイラのどちらかのみで(混在せず)ビルドされていることを確認してください。
上記の警告メッセージを無視してリンクを終了させると、アプリケーションでランタイム エラーが発生する可能性があります。
コンポーネントまたはライブラリ ベンダーの Clang バイナリまたは Classic バイナリの提供
次のステップに従ってください:
- 2 つのパッケージまたはライブラリを作成します: 1 つは Classic でコンパイルされたもの、もう 1 つは Clang でコンパイルされたものです。
- Classic パッケージは lib\win32[debug|release] フォルダに入れられます。
- Clang パッケージは lib\win32c[debug|release] フォルダに入れられます(C がついている点に注意)。
- パッケージは同じ名前でなければなりません。
- Classic ツールチェーンは、常に lib\win32 内を見ます。 Clang の方は、lib\win32c を見、その後 lib\win32 を見ます。 つまり、Clang 版のパッケージをまず検索し(これが両方が同じ名前でなければならない理由です)、なかった場合には Classic 版を検索し、その後なければエラーとなります。