0

ネイティブ コードのデバッグに関する以前の質問に続いて、サービスを直接デバッグしてもうまくいかなかったため、コンソール アプリから簡単なテストを作成することにしました。

そこで、vc6 コンソール アプリを作成し、dll プロジェクトをワークスペースに追加して実行しました。

期待どおりに実行する代わりに、次のリンカ エラーを吐き出しました。

 main.obj : error LNK2001: unresolved external symbol "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,long,long *)" (?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z)
 main.obj : error LNK2001: unresolved external symbol "int __stdcall hmGetDocBasePath(char *,long)" (?hmGetDocBasePath@@YGHPADJ@Z)
 Debug/HazManTest.exe : fatal error LNK1120: 2 unresolved externals

これは、リンカ オプションで何かを忘れている単純なケースのようです。しかし、すべて正常なようで、lib ファイル、dll、およびソースが利用可能です。libファイルをナンセンスにロードするように変更すると、それが起動するfatal error LNK1104: cannot open file "asdf.lib"ので、それは問題ではありません。

以前に dll にリンクしたことがありますが、それらは機能しました。

更新:このスレッドに従って、追加情報を見つけられるかどうかを確認しました。これは、VS2005 の dumpbin が提供するものです。

> dumpbin /linkermember Hazardman.lib | findstr "DocumentLAdd"
     F6DC __imp__hmDocumentLAdd@36
     F6DC _hmDocumentLAdd@36
       5B __imp__hmDocumentLAdd@36
       5B _hmDocumentLAdd@36

次に unname を介して実行すると、次のようになります。

> undname ?_hmDocumentLAdd@36
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?_hmDocumentLAdd@36"
is :- "?_hmDocumentLAdd@36"

これは間違っています。IDE からマングルされた名前を入力すると、次のより良い結果が得られます。

> undname ?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z"
is :- "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,l
ong,long *)"

この情報を入手したのですが、どうすればよいですか? このレイモンド・チェンの記事から、手動で修正できるようですが、オプションを微調整できますが、結果からどのオプションが必要かを判断できません (「すべてのパラメーターを無視する」チェックボックスはありますか?!)。

したがって、存在しない関数を探しているか、関数のパラメーターが省略されているようです (または、dumpbin は VC6 ライブラリが好きではありません)。

4

1 に答える 1

1

正しい呼び出し規約を使用していますか? ライブラリは を使用しているようstdcallです。多分あなたのテストコードはcdecl(デフォルトのようです)を使用しています。

このページによると、リンカ名の装飾は呼び出し規則によって異なるため、発生している症状を説明できます。

于 2010-04-13T08:12:42.430 に答える