2013-06-16 13 views
5

私のDLLにリンクしているアプリケーションを実行しようとしたときに奇妙なエラーが発生しました。このDLLは動作していましたが、DLLのコードを変更していて、コンパイルできました。残念ながら、アプリケーションを実行しようとすると...エントリポイントが見つかりません

--------------------------- 
GameTest001.exe - Entry Point Not Found 
--------------------------- 
The procedure entry point [email protected]@[email protected]@@Z could not be located in the dynamic link library Renderer02.dll. 
--------------------------- 
OK 
--------------------------- 

このエラーの解釈方法はわかりません。私は何が変わったのか知っていて、私のコードは私にはうまく見えます。私はこれをグーグルで試してみたが、運がまったくなかった。

誰もがこのことを理解することはできますか?このエラーは何を意味しますか?

答えて

2

名前が変更されてエクスポートされた関数にリンクしています。その名前は[email protected]@[email protected]@@Zです。ロードされているDLLはその名前の関数をエクスポートしないため、エラーが発生します。

名前のマングリングは、関数の名前、パラメータ、戻り値をエンコードします。したがって、不一致の原因としては、関数の名前、パラメータ、または戻り値を1か所で変更したが、他の場所では変更していない可能性があります。

DLLを変更した場合は、新しい.libファイルと.dllファイルを生成するためにDLLを再コンパイルする必要があります。また、.hファイルも変更されます。これら3つのファイルのすべての変更されたバージョンが、DLLにリンクするプログラムによって使用されていることを確認します。

このエラーメッセージは、実際にコードを実行する前にインターフェイスの両面が一致することを確認するため、実際に役立ちます。

更新

私は上記のテキストで十分それを明確にしませんでした。 DLLのインターフェイスを変更するときは、次の操作を行う必要があります。

  1. アプリケーションで使用されている.hファイルをすべて更新します。
  2. DLLを再コンパイルして、新しい.libファイルと.dllファイルを生成します。
  3. 更新された.libと.hファイルを使用してアプリケーションを再コンパイルします。
  4. 更新されたアプリケーションが更新されたDLLを読み込むように、新しい.dllファイルを配布します。
+0

でこれを試してみてください。しかし、実際には、新しいバージョンのDLLを使用していた数週間、再構築する必要のないアプリケーションを再構築する必要があったようです。 – Interminable

+0

はい、それは私が言ったことです。 DLLを変更したので、新しい.dllファイルを使用するには、新しいバージョンの.hと.libファイルでアプリケーションをコンパイルする必要があります。 –

+0

あなたは、アプリケーションを再コンパイルする必要があるとは言及していませんでした(以前のDLLの変更では、アプリケーションを再コンパイルする必要はありませんでした)。 – Interminable

2

あなたのDLLにはMusic::Music(class Music const &)が存在しないようです。 [email protected]@[email protected]@@Zは、この関数の変換された名前です。関数名は、this siteを使用してデマングルできます。

+0

そのサイトの多くのありがとう! – Interminable

+0

デングリングは問題を解決しません。解決策は、DLLとアプリケーションの両方が一致することを確認することです。 –

+1

はい、しかし、デマングルのものが実際に何であるかが分かっているのは確かです。 – Interminable

0

は、私が無駄にDLLとそのlibのファイルを何回も再構築したいあなたのC++コード

extern "C" 
{ 
    inline __declspec(dllexport) int MyFunction() 
    { 
    return 63; 
    } 
} 
関連する問題