-1

私は最初のインターンシップに取り組んでいますが、この恐ろしいものをVisual Studio 2008でコンパイルしようとしています。IDE設定とWindowsSDKのインストールを1週間試しましたが、何も作成しないと思います。その方向にさらに前進します。誰もがここで休暇を取っているので、私には頼れる上級エンジニアがいません。Stack Overflowを手伝ってください、あなたが私の唯一の希望です!

今日、私は特定のエラーを追跡しようとしているので、すべてが壊れている理由がわかります。おそらくそれなら、私はそれを修正する方法についてより良い洞察を得るでしょう。ここ数時間、私はこれに取り組んできました:

6>ResizableLib.lib(ResizablePage.obj) : error LNK2001: unresolved external symbol "public: virtual int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)

私の理解では、CWnd :: Create関数は、私が作業しているResizableLibプロジェクト内からは見つかりません。呼び出されていたファイルを見つけ、インクルードをトレースして、呼び出されたポイントでCWnd::Createの定義が必要かどうかを確認しました。プロジェクト全体(alt + E + F + I)でCreate(を検索することから始めました。これにより、Create関数が呼び出されているすべてのインスタンスが取得されると考えたためです。Createで終わる関数への他の呼び出しがいくつか見つかりましたが、1つだけです。 Create関数自体を呼び出しているように見えます。

ResizableGrip.cpp(127): BOOL bRet = m_wndGrip.Create(WS_CHILD | WS_CLIPSIBLINGS

だから...私はResizableGrip.cppを開いて、インクルードを調べました。ファイルの最初の行は次のとおりです。

#include "stdafx.h"

そのファイルをチェックして、CWnd :: Createの関数宣言があるかどうか、またはおそらくそのファイルのある種の継承バージョンがあるかどうかを確認することにしました。このファイルを含めるためのプリプロセッサ条件はありませんでした(このプログラムには他の多くのポイントがあるため)。したがって、stdafx.hが含まれると言っても差し支えないと思いました。どれを把握するためstdafx.hファイルが含まれます(とにかく通常使用されるstdafx.hファイルは何ですか?私はそれらをいたるところに見ます!)、コンパイラが最初に見えると思うので、私は最初にResizableGrip.cppファイルと同じディレクトリを調べましたプロジェクト内の追加のインクルードパスを確認する前に、インクルードファイルと同じディレクトリにあり、最後にメインのVisual StudioVC++設定にリストされているインクルードパスが続きます。これは正しいです?とにかく、同じディレクトリにStdAfx.hファイルがあったので、これが含まれると結論付けました。ファイルの最初の数行は次のようになりました。

#if !defined(AFX_STDAFX_H__0A781DD9_5C37_49E2_A4F5_E517F5B8A621__INCLUDED_)
#define AFX_STDAFX_H__0A781DD9_5C37_49E2_A4F5_E517F5B8A621__INCLUDED_
#pragma message("StdAfx CommonClasses/ResizableLib")
#ifdef INC_DEBUG
#pragma message("In ResizeLib::StdAfx.h") 
#endif

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#if _MSC_VER >= 1300
#define  WINVER      0x0500
#define _WIN32_WINNT 0x0500
#endif

#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>         // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

ここで行われているすべてのプリプロセッサのことを完全には理解していないことは認めますが、#includeを取り巻く条件がないため、それも含まれていると思います。プロジェクトディレクトリにafxwin.hファイルがなかったので、プロジェクトの追加インクルードを調べました。指定された唯一の場所は....\COMMONだったので、2つのディレクトリを取り出し、COMMONフォルダを見つけて、afxwin.hを探しました。そこには何もなかったので、VC++ディレクトリインクルードのIDE設定を調べました。最初のリストは$(WindowsSdkDir)\ includeだったので、WindowsSdkDir環境変数を調べましたが、もちろん存在しませんでした。レジストリもチェックインしました。サイコロはありません。最終的に、楕円の1つをクリックすることで、これらの記号名を解決できることがわかりました(..。)プロジェクト構成ウィンドウのテキストフィールドの右端に表示されます。これらのウィンドウをクリックして[マクロ]ペインを展開すると表示されます。これを行うことで、$(WindowsSdkDir)がC:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \を指していることを発見したので、そこに移動してIncludeフォルダーを開きましたが、afxwin.hファイルが見つかりませんでした。$(FrameworkSDKDir)includeは$(WindowsSdkDir)\ includeと同じ場所を指しているので、Visual Studio VC ++ディレクトリインクルードリストの次の行に進みました:$(VCInstallDir)atlmfc \ includeはC:\ ProgramFiles\に解決されましたMicrosoft Visual Studio 9.0 \ VC \ atlmfc \ include \ここで、ついにafxwin.hを見つけました。このファイルには、最終的に、次のように定義されたCreateという関数を持つCwndというクラスがありました。

virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);

これらのパラメーターのいずれかが何であるかはわかりませんが、これはリンカーが最初に泣き言を言っていた関数の非常に再定義されたバージョンであるという仮定に基づいて操作しています。

CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)

そうでなければ、リンカーが引き継ぐ前に、コンパイラーはこれを関数の別のバージョンとしてキャッチしませんか?実際、私はそれについて考えたので(したがって、私の投稿の理由全体)、コンパイラエラーのトラブルシューティングと同じ方法でコードをウォークスルーするだけだったと思います。私もそうしましたか?これは怪物で、私はここで推測しているだけです。

繰り返しになりますが、タイトルにあるように、リンカーエラーをどのように追跡する必要がありますか? 私がここで行ったことと同様のプロセスはありますか?MSDNの記事では、コードが正常に機能し、コンパイラがなんとかして.objファイルまたは.libファイルを失ったときにこのエラーが発生したように聞こえます。どうすれば正しい場所を再び指すようにできますか?

うーん、-アレックス

4

1 に答える 1

0

リンカー エラーは、ヘッダーは見つかったが、実装 (obj または lib) が見つからなかったことを意味します。ヘッダーが存在するかどうかを確認しても意味がありません。コードがコンパイルされているため、コンパイラーはヘッダーを見つけました。

MFC (つまり、CWnd 実装を含むライブラリ) に対してリンクする必要があるようです。

プロジェクトのプロパティで、次を設定します。

General > Use of MFC > Use MFC in a Shared DLL

stdafx.h に関しては、プリコンパイル済みヘッダーです。あなたはそれらを自分で読むことができます。;) 必要ない場合は、プロジェクトのプロパティでオフにすることができます。

C/C++ > Precompiled Headers > Precompiled Header > Not Using Precompiled Headers
于 2012-07-19T00:09:55.023 に答える