12

Visual Studio 2010 を使用して C++ でスタティック ライブラリをリンクしようとしています。問題は、ライブラリ (および付随するヘッダー) に多数の MFC オブジェクトが含まれていることです。MFC を含めるようにプロジェクトを再コンパイルしたり、MFC を使用しないようにライブラリを再コンパイルしたりせずに、ライブラリの関数の 1 つを呼び出したいと考えています。このコードプロジェクトの記事は、プロジェクトで関数を外部に定義すると(「extern」キーワードを使用して)、これが可能であることを暗示しているようです。

しかし、私は運がありませんでした。何を試しても、未解決の外部シンボル エラーが発生します。

記事は正しいですか?そうでない場合、そのようなリンクは他の方法で可能ですか?

4

4 に答える 4

0

静的ライブラリは、1つ以上のコンパイル済みモジュールの蓄積です。各モジュールは他のモジュールに依存する可能性があり、それらのモジュールの一部は他のライブラリにある可能性があります。

必要な関数が他の依存関係を持たないモジュールにある場合、または依存関係がすべて現在のライブラリに含まれている場合は、適切な関数プロトタイプを作成したら、その関数をリンクできます。追加の依存関係がある場合は、運が悪いです。

于 2012-08-07T19:23:09.293 に答える
0

呼び出したい関数がMFCビットを使用している場合は、プロジェクトにもMFCサポートを追加する必要があります。ただし、そうではなく、関数がライブラリによってエクスポートされている場合は、関数を呼び出すファイルに関数のプロトタイプを追加して、ライブラリを実行可能ファイルにリンクするだけです。

たとえば、エクスポートされた関数を呼び出すファイルに次のような行を追加します。

void __stdcall foo( int );

呼び出し規約が正しいことを確認してください。これは。とは異なる場合があります__stdcallextern "C"また、名前のマングリングを防ぐために追加する必要がある場合があります。

于 2012-08-07T19:08:57.837 に答える
0

たとえば、timeGetTime を呼び出す必要があり、いくつかの競合のために mmsystem.h を含めない理由がある場合は、次のようにすることができます。

extern "C" DWORD WINAPI timeGetTime(void);
#pragma comment(lib, "winmm.lib")
于 2013-03-29T12:36:22.260 に答える