7

私は本当に漠然とした問題を抱えていますが、誰かがそれを助けてくれることを願っています. C++ プロジェクトを変更していて、昨日はまだ機能していましたが、今日は機能しません。何も変更していないことは確かですが、完全に確認するために、SVN からプロジェクトを再度チェックアウトし、以前のシステム復元ポイントに戻しました (これは仕事用のコンピューターであるため、密かに更新プログラムなどをインストールすることがあります. )。正常にコンパイルした後、プログラムを起動できますが、操作を行った後、次 のエラーが発生します。プロシージャ エントリ ポイント ?methodName@className@@UAEXXZ could not be located in the dynamic link library libName.dll.

インターネットで検索しましたが、ほとんどの人の問題は、古いバージョンの DLL が使用されていることが原因のようです。コンピューターを検索しましたが、古いバージョンはありません。正しいバージョンを削除すると、アプリケーションが起動しません。その後、プロジェクトを再コンパイルすると、DLL が再度作成されるため、アプリケーションが正しい DLL を使用していることと、コンパイルによって作成されていることの両方が確信できます。エラーが参照するメソッドに構文エラーを導入すると、プロジェクトはコンパイルを拒否するので、これはメソッドを含むファイルもコンパイルしていることを意味すると思います。

基本的に、私は DLL やリンクなどについて何も知らないので、プロジェクトで非常に明確に定義されている関数が突然 DLL に組み込まれなくなった理由について誰かが考えを持っていれば、非常に感謝しています。 . これが漠然としていることは承知しています。さらに情報が必要な場合は、喜んで提供します。ありがとう!

更新:与えられた提案を試しましたが、まだ行き詰まっています。__declspec(dllexport)プロジェクト全体では明らかに使用されていません。Dependency Walker で DLL を開くと、空の右上のセクションが表示され、その下のセクションにエラー メッセージの関数が一覧表示されます。Undecorate C++ Functionsをチェックすると問題ないように見えますが、そうしないと、エラー メッセージから奇妙な疑問符と @s が表示され、最後に違いがあるように見えます。

?methodName@className@@UAEXXZ
?methodName@className@@UAEXH@Z

おそらくこれが問題なのかもしれませんが、それが何を意味するのか、何が原因なのか、どうすればよいのかわかりません。

4

4 に答える 4

9

実際に使ってい__declspec(dllexport)ますか?その宣言がなければ、その関数は DLL によってエクスポートされません (つまり、その DLL をロードするプログラムは、その宣言がなければ関数にアクセスできません)。

また、Dependency Walkerを使用して、DLL が使用可能にした関数を正確に確認してみてください。


関数宣言で使用されないという事実__declspec(dllexport)は問題ありません。ほとんどの場合、次のように単一のヘッダー ファイルで 1 回だけ使用されます。

#ifdef MAKING_DLL
#define FOO_API __declspec(dllexport)
#else
#define FOO_API
#endif

そのセクションの前にある場合#define MAKING_DLL、like として宣言されているすべての関数は、定義さFOO_API int BakeACake()れているかどうかに基づいてエクスポートされます。MAKING_DLLビルドされたプロジェクトの種類 ( のようなもの) に応じて、プロジェクトがコマンド ラインで定義されることを期待していたMAKING_DLL(またはそれに相当するもの)/DMAKING_DLL可能性があります/DFOO_API=__declspec(dllexport)

Dependency Walker の空の右上のセクションは、プログラムが DLL の対応する .lib ファイルに対してリンクしていないことを意味します。それは問題ありません。単に、DLL 内の関数を使用しているLoadLibraryか、関数にアクセスしていることを意味します。LoadLibraryEx

もう 1 つのかなり可能性の高いシナリオ (マングルされた名前が異なるという事実に基づく) は、DLL のビルドに使用した 2008 とは異なるバージョンの Visual Studio を使用してプログラムがビルドされたことです。単純な C とは異なり、C++ には標準のバイナリ インターフェイスがありません。つまり、DLL で C++ クラスを使用している場合は、同じコンパイラを使用してプログラムと DLL をビルドする必要があります。可能であれば、VS2008 でプログラムを再構築するか、プログラムが構築されたのと同じバージョンの VS で DLL を再構築してみてください。

于 2009-12-03T18:00:06.820 に答える
2

依存関係ウォーカーをダウンロードし、このツールを使用して dll を開きます。dll からエクスポートされた関数のリストが表示されます。上記のメソッドが期待される機能の一部であるかどうかを確認します。__declspec(dllexport)そうでない場合は、その dll のいずれかのクラスを誤って削除したことを意味します。

于 2009-12-03T18:04:40.633 に答える
1

少しばかげているように感じますが、答えを見つけました。私が使用していたアプリケーション (exe) は、元の投稿で言及したものに依存する 2 つ目の別の dll をロードしたようです。この 2 番目の dll はまだ古い関数を想定しており、更新された dll に対して再コンパイルする必要もありました。

ここで私を助けようとした人々に感謝します!

于 2009-12-08T17:00:14.550 に答える
0

上記の投稿の情報を使用して、簡単な一般的な解決策を見つけました。依存関係ウォーカーで実行可能なプログラムを開き、不足している関数を探し、それを使用している dll を調べ、その dll をビルドするプロジェクトを見つけて再構築するだけです。

于 2011-04-18T07:14:49.437 に答える