質問

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

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

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

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

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

- - - - - - - - - - 構成:TestComms - Win32 デバッグ-------------------- リンク中...comms.lib(iocomletionport.obj):エラーLNK2001:未解決の外部シンボル「public:」仮想クラスstd :: Basic_string、class std :: allocator> __thiscall comms :: exception :: getmessagea(void)const "(?getmessagea@comms @@ ube?av?$ basic_string@du $ char_traits@d@std@std @@ v?$ allocator@d@2 @@ std @@ xz)debug/testcommse:致命的なエラー LNK1120:1リンクを実行する未解決の外部エラー。

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

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

役に立ちましたか?

解決

可能性の 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 class は上記の #2 のインスタンスでした。おそらく、windows.h がロードされていない場所で使用されているのではないでしょうか?

私があなたの代わりに行うその他のことは、単なるルーティンとして次のとおりです。

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

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

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

編集:書式設定との戦い:(

他のヒント

@カート:あなたが一番近くまで来たと思います。私はこれをテストしていませんが、元の質問である程度の答えが得られたと思います。

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

プロジェクトの設定をいじって、必要のないものを削除していないと仮定します (これには、User32.lib などの外部依存関係が存在すると予想されます)。

ツールを確認|オプション|ディレクトリ|図書館(ここに記憶から移動します)そして、あなたがすべての普通のバラエティLIBディレクトリを見逃していないことを確認します(繰り返しますが、私の前にVC6がなければ、私はあなたに彼らが何であるかをあなたに伝えることはできません)

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

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

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

  1. それは確認されています。何もおかしなところはありません。
  2. 完了しました - ビルドディレクトリを削除しました
  3. ハードコーディングされたパスは決して使用しません。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top