0

我正在開始第一次實習,仍在Visual Studio 2008上嘗試get this horrible thing to compile。我花了一週的時間來玩IDE設置和Windows SDK安裝,我不認爲我會在那個方向。大家都在這裏度假,我沒有高級工程師轉向。幫助我堆棧溢出,你是我唯一的希望!如何關注此鏈接錯誤?

今天,我試圖按照具體的錯誤,所以我有一些想法爲什麼一切都打破。也許那時我會更好地瞭解如何解決它。在過去的幾個小時裏,我一直工作在這一個:

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 *)" ([email protected]@@[email protected]@[email protected]@@@Z)

我的理解是,CWnd的:: Create函數不能從我的工作的ResizableLib項目中找到。我想我會找到它被調用的文件,然後跟蹤包含文件,看它是否應該在被調用的地方有一個CWnd :: Create的定義。我開始通過搜索整個項目(alt + E + F + I)進行創建(因爲我認爲這將獲得調用Create函數的每個實例,我發現了幾個其他函數以Create結尾,但只有一個這似乎是調用創建函數本身:

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

所以......我打開了ResizableGrip.cpp,看着包括文件的第一行是:

#include "stdafx.h"

我想我會去檢查那個文件,看看是否有一個函數de CWnd :: Create的聲明,或者某種類型的繼承版本。沒有預處理條件來包含這個文件(因爲在這個程序中有許多其他的地方),所以我認爲可以說包含了stdafx.h是安全的。爲了弄清楚哪個 stdafx.h文件將被包含(通常用於stdafx.h文件是什麼?我看到它們到處都是!),我首先查找與ResizableGrip.cpp相同的目錄因爲我相信在檢查項目中的其他包含路徑之前,編譯器首先在包含文件的同一目錄中查找,最後在主Visual Studio VC++設置中列出的包含路徑。它是否正確?無論如何,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,所以我找到了兩個目錄,位於COMMON文件夾,並查找了afxwin.h。那裏什麼也沒有,所以我查看了包含VC++目錄的IDE設置。第一個列表是:$(WindowsSdkDir)\ include,所以我查了一下WindowsSdkDir環境變量,當然這個變量不存在。我也檢查了註冊表。沒有骰子。最終我發現可以通過點擊項目配置窗口中文本字段最右端出現的一個省略號(...)來解決這些符號名稱,這些省略符號在點擊它們並展開宏時出現窗格。通過這樣做,我發現$(WindowsSdkDir)指向:C:\ Program Files \ Microsoft SDK \ Windows \ v6.0A \所以我去了那裏,打開了Include文件夾,並且沒有找到afxwin.h文件。$(FrameworkSDKDir)include指向與$(WindowsSdkDir)\ include相同的位置,因此我繼續到Visual Studio VC++目錄包含列表中的下一行:$(VCInstallDir)atlmfc \ include其中解析爲C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \最終找到了afxwin.h。在這個文件中,有終於一個叫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 article聽起來像這樣的錯誤發生時,代碼工作正常,編譯器以某種方式管理失去.obj文件或.lib文件。我怎樣才能讓它再次指向正確的地方?

唉, -Alex

+0

你必須把這個怪物帶到Linux嗎?節哀順變。請注意'LPCTSTR','DWORD'等是類型定義,它們對於它們的實際C類型(這是相當差的類型)「衰減」(因爲缺少正確的術語)。這些都是Windows-isms,所以你最終需要爲你的端口編寫類似的typedef或者全部替換它們。 – sarnold 2012-07-19 00:01:56

+0

這是一個鏈接器錯誤,不是編譯器錯誤。如果您遇到編譯器錯誤,您嘗試和解決它的過程就是您要使用的過程。所有錯誤都告訴你,它無法找到它需要鏈接的靜態庫,換句話說,它找不到包含函數CWnd :: create的編譯的文件。您必須在Visual Studio中轉到鏈接器設置對話框並添加相關的庫。 – sashang 2012-07-19 00:04:15

+0

CWnd是MFC的一部分。確保你正在鏈接MFC。有人對最近的VS更熟悉可以告訴你如何做到這一點。 – Adam 2012-07-19 00:09:07

回答

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 
+0

不幸的是,該項目已經設置爲在共享DLL中使用MFC。也許我鏈接到錯誤的MFC版本?我一直在尋找[this](http://en.wikipedia.org/wiki/Microsoft_Foundation_Class_Library)維基百科頁面,它似乎列出了一堆不同的DLL。 CWnd函數是否需要包含在其中之一中? – 2012-07-19 17:01:29

+0

我繼續前進,搜索了MFC90.dll,並在我的電腦上找到了11份不同文件大小的副本。其中9個位於WinSxS目錄中,其中4個似乎適用於x86 MFC分發版的不同版本。其中的一些不在維基百科列表中。不在SxS目錄中的2個MFC90.dll文件位於Visual Studio目錄本身中,其中一個似乎也適用於x86。我應該如何告訴哪一個鏈接?再說一遍,一旦找到合適的文件,我該如何告訴IDE做鏈接?抱歉有這些問題! – 2012-07-19 17:06:05

+0

嗯,所以我嘗試將這些MFC90.dll文件的路徑添加到項目屬性 - >配置屬性 - > librarian-> general->其他庫目錄。每次項目成功編譯(而不是簡單地說它是最新的),但遇到相同的鏈接器錯誤。我決定嘗試其中一個amd64,看它是否真正從我指定的庫中編譯。但是,這也成功了,它告訴我,它實際上並不包含此代碼。再次,我如何告訴IDE要鏈接到什麼? – 2012-07-19 17:25:59