11

ライブラリとそのテスト ハーネスである古いワークスペースを開きました。以前は正常に動作していましたが、現在は動作せず、古いバージョンのコードも同じエラーで動作しません。プロジェクトを再作成しようとしましたが、同じエラーも発生します。プロジェクト設定に異常はなく、生成されたコードはメイン アプリで動作します。

ほとんどのファイルを削除し、エラーを生成するために最小限に抑えました。残念ながら、これは製品コードで使用されているため、プロジェクトを投稿できません。

通常、LNK2001 リンカー エラーは、ライブラリを中断したか、仮想関数の実装を忘れたことを意味します。ただし、これは標準テンプレート ライブラリの一部であり、そのヘッダーです。

IOCompletionPort.obj で問題があるとリストされているコードは、実際にはstd::string直接使用していませんが、次のことを行うクラスを呼び出します: a とorの値をComms::Exception受け入れます。std::stringGetLastErrorWSAGetLastError

エラー ( GetMessage) に記載されている関数は実装されていますが、仮想関数であるため、必要に応じて他のクラスがオーバーライドできます。ただし、コンパイラはそれを Ansi バージョンとして作成したようですが、それを制御する設定のオプションが見つかりません。それが問題かもしれないと思いますが、ライブラリのオプションがほとんどないため、確実に知る方法がありません. ただし、どちらのプロジェクトもコンパイラ オプションで _MBCS を指定します。

--------------------構成: TestComms - Win32 デバッグ-------------------- リンク中... Comms.lib(IOCompletionPort.obj): エラー LNK2001: 未解決の外部シンボル "public: virtual class std::basic_string,class std::allocator > __thiscall Comms::Exception::GetMessageA(void)const " (?GetMessageA@ Exception@ Comms@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) Debug/TestComms.exe : 致命的なエラー LNK1120: 1 つの未解決の外部エラー実行中link.exe.

TestComms.exe - 2 つのエラー、0 の警告

助言がありますか?私はこれで午前中のほとんどを失いましたが、午後もほとんど失いたくありません。

4

5 に答える 5

6

可能性の 1 つは、Win32 ANSI/Unicode の「名前マングリング」にあり、シンボルが または のGetMessageいずれGetMessageAかに変換されますGetMessageW。次の 3 つの可能性があります。

  1. Windows.h はロードされていないため、GetMessageそのままですGetMessage

  2. Windows.h には ANSI 用のシンボル セットが読み込まれていたため、次のようにGetMessageなります。GetMessageA

  3. Windows.h には Unicode 用のシンボル セットが読み込まれているため、次のようにGetMessageなります。GetMessageW

2 つの異なるシナリオをトリガーする方法で 2 つの異なるファイルをコンパイルした場合、リンカー エラーが発生します。エラー メッセージは、Comms::Exceptionクラスが上記の #2 のインスタンスであることを示しています。おそらく、windows.h が読み込まれていない場所で使用されていますか?

日常の問題として、私があなたの代わりに行うその他のこと:

1) インクルード パスとライブラリ パスに、予期しないものが含まれていないことを確認します。

2) 「ビルド クリーン」を実行してから手動で検証し、必要に応じて余分なオブジェクト ファイルを削除します。

3) プロジェクトが最初に再構築されたときの意味を意味しないハードコードされたパスが include ステートメントに含まれていないことを確認してください。

編集:フォーマットとの戦い:(

于 2008-08-08T13:30:03.507 に答える
1

@Curt:あなたが一番近くに来たと思います。私はこれをテストしていませんが、私は元の質問で答えを出したと思います。

GetMessageは、Ansi(GetMessageA)とUnicode(GetMessageW)を切り替えるためにifndefブロックでラップされたWindows.hの定義です。

于 2008-08-09T10:50:00.880 に答える
0

windows.h は、IOCompletionPort.h の先頭でインクルードとして宣言されています。1 つのファイルをインクルードするためだけに 7 行を表示するのにうんざりしていたので、独自のファイルをラップして、それ自体をインクルードしました。これには、いくつかの追加の #defines (ULONG_PTR など) も含まれています。これは、メインのアプリが Platform SDK がインストールされているとコンパイルされないためです:-(

  1. それが確認されています。場違いなことは何もありません。
  2. 私はそれをやった - ビルドディレクトリを削除した
  3. ハードコーディングされたパスを使用することはありません。
于 2008-08-08T13:52:29.013 に答える
0

プロジェクト設定で、あるべきではないものを削除していないと仮定します(これは、User32.lib のような外部依存関係があると私が期待する場所です):

ツールをチェック | オプション | ディレクトリ | ライブラリ (ここではメモリから移動します) と、一般的なすべての庭のさまざまな lib ディレクトリを見逃さないようにします (繰り返しますが、私の前に VC6 がなければ、それらが何であるかはわかりません)。

于 2008-08-08T13:54:35.763 に答える
0

これは、Microsoft が ANSI 対 Unicode API を処理する方法に関する一般的な問題です。関数名の 'A' または 'W' バージョンに解決される関数名のマクロを定義することによって、それらはすべて (またはほぼすべて) 行われるため、namespace/class/struct/enum/ に識別子を安全に含めることはできません。 Windows API 名に一致する関数。

windows.h マクロは、他のすべての名前空間に対して大雑把に実行されます。

于 2008-09-16T18:52:32.827 に答える