2

私は、サードパーティの静的ライブラリ (ここでは EXTERNALLIB と呼ばれます) にリンクするプロジェクトに取り組んでいます。Visual Studio 2005 では、EXTERNALLIB にリンクして、使用可能な実行可能ファイルを作成することができました。現在、Visual Studio 2008 を使用していますが、次のエラーが表示されます。

fatal error C1047: The object or library file EXTERNALLIB was created with an older compiler than other objects; rebuild old objects and libraries.

EXTERNALLIB に正しくリンクするようにコンパイラに指示する方法はありますか? この問題は、特定の呼び出し規約 (__stdcall、__cdecl、__clrcall、__thiscall) に関連していると思われます。新しいプログラムで古いライブラリの正しい呼び出し規約を示すことはできますか? 今後のコンパイラのアップグレードでこの問題が発生しないように、ベンダーに提供できる特定のフィードバック (ヘッダー ファイルで APIENTRY を使用するなど) はありますか?

コードは C++ で書かれています。EXTERNALLIB のコードにアクセスできないため、自分で再構築することができません。

4

1 に答える 1

5

問題は「コードがC++で書かれている」ことに起因する可能性があります。ABI for C ++リンケージは、基本的にどの標準でも完全に指定されておらず、コンパイラーごとに変更可能であることで有名です。VSは、ABIが再び変更されたため、ライブラリに直接リンクできないことを伝えようとしているのではないかと思います。

この問題は、DLLにC ++オブジェクトを実装したい場合に悪化することがよくありますが、幸いなことに、ここではその問題は発生していません。

動作するはずのソリューションへの1つのアプローチは、公開されているEXTERNALLIBのAPIをC呼び出し可能なアダプターでスキンし、そのすべてをDLLにリンクすることです。古いVSバージョンでスキンを構築します(最悪の場合、無料版はまだ見つかります)。extern "C"関数のみが公開されていることを確認してください。特に、グローバルオブジェクトがDLLから公開されていないことを確認してください(ただし、それらはスキン内に存在する必要がある場合があります)。

最善の答えは、EXTERNALLIBのサプライヤに戻って、現在のVSとのリンクの失敗をバグとして丁寧に報告し、再構築されたバージョンを要求することです。

于 2009-09-21T21:26:41.740 に答える