0

저는 처음으로 인턴쉽을하고 있는데 Visual Studio 2008에서 get this horrible thing to compile을 시도하고 있습니다. 저는 IDE 설정 및 Windows SDK 설치로 1 주일을 보냈으며 더 이상 진전을 이루지 못할 것이라고 생각합니다. 그 방향. 모두들 여기서 휴가를 보내고 있습니다. 저는 수석 기술자가 없습니다. 오버플로 스택 오버 도움이, 당신은 내 유일한 희망이야!이 링커 오류를 어떻게 따라야합니까?

오늘 나는 구체적인 오류를 따르려고 노력하고 있습니다. 그래서 어떤 아이디어가 있습니다. 모든 것이 깨졌습니다. 어쩌면 나는 그것을 고치는 방법에 대한 더 나은 통찰력을 갖게 될 것이다. 시간의 지난 몇 동안 나는이 일에 일한지 :

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)

나의 이해는 혼잡 윈도우가 :: 기능을 작성하는 것은 내가 함께 일하고 있어요 ResizableLib 프로젝트 내부에서 찾을 수없는 것입니다. 나는 그것이 호출되는 곳의 파일을 찾을 것이라고 생각하고 포함되어 있는지 추적하여 CWnd :: Create에 대한 정의가 있어야 하는지를 확인했다. Create (Create + Create + 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 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 주변에는 조건문이 없기 때문에 내가, 내가 완전히 여기에 가고있는 처리기 모든 것들을 이해하지 인정하지만 것 I 그것도 포함될 것으로 가정합니다. afxwin.h 파일이 프로젝트 디렉토리에 없으므로 프로젝트의 추가 포함을 살펴 보았습니다. 볼 수있는 유일한 장소는 .... \ COMMON이었습니다. 그래서 두 개의 디렉토리를 찾아 COMMON 폴더에 위치 시켰고 afxwin.h를 찾았습니다. 거기에는 아무것도 없었으므로 VC++ 디렉토리에 대한 IDE 설정을 살펴 보았습니다. 첫 번째 목록은 $ (WindowsSdkDir) \ include이므로 WindowsSdkDir 환경 변수를 찾았습니다. 물론이 변수는 존재하지 않았습니다. 나는 또한 기입에서 검사했다. 주사위가 없다. 결국 나는 당신이 그들을 클릭하고 매크로를 확장 할 때 나타나는 프로젝트 구성 창의 텍스트 필드의 맨 오른쪽 끝에 나타나는 생략 부호 (...) 중 하나를 클릭하여 이러한 상징적 인 이름을 해결할 수 있다는 것을 알아 냈습니다 창유리. 이렇게하면 $ (WindowsSdkDir)이 C : \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \를 가리키고 있다는 것을 알았습니다. 그래서 거기에 가서 Include 폴더를 열고 afxwin.h 파일을 찾지 못했습니다.$ (FrameworkSDKDir) include는 $ (WindowsSdkDir) \ include와 같은 위치를 가리키고 있으므로 Visual Studio VC++ Directory 포함 목록의 다음 줄로 진행했습니다. $ (VCInstallDir) atlmfc \ include가 C : \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include \ 여기서 afxwin.h가 마지막으로 발견되었습니다. 이 파일에서 마지막으로 있었다라는 함수와 혼잡 윈도우라는 클래스는 다음과 같은 정의 만들기 : 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 파일을 잃어 버릴 때이 오류가 발생하는 것처럼 들립니다. 올바른 장소를 다시 가리 키도록하려면 어떻게해야합니까?

윽, 알렉스

+0

이 괴물을 Linux로 가져와야합니까? 내 애도. 'LPCTSTR','DWORD' 등은 실제 C 타입 (타입이 형편 없음)에 대해 "부패"(올바른 용어가 없음) 한 타입 정의입니다. 그것들은 모두 Windows라는 것이므로 결국 포트에 대한 유사한 typedef를 작성하거나 모두 대체해야합니다. – sarnold

+0

링커 오류입니다. 컴파일러 오류가 아닙니다. 시도하고 해결하는 데 사용 된 프로세스는 컴파일러 오류가있는 경우 사용할 프로세스입니다. 모든 오류는 연결해야하는 정적 라이브러리를 찾을 수 없다는 것을 말하고 있습니다. 즉, CWnd :: create 함수의 컴파일을 포함하는 파일을 찾을 수 없습니다. Visual Studio에서 링커 설정 대화 상자로 이동하여 관련 라이브러리를 추가해야합니다. – sashang

+0

CWnd는 MFC의 일부입니다. MFC를 연결하고 있는지 확인하십시오. 최근 VS에 더 익숙한 사람이이를 수행하는 방법을 알려줄 수 있습니다. – Adam

답변

0

링커 오류는 헤더을 발견입니다하지만 구현 (OBJ 나 LIB를) 찾을 수 없습니다 의미합니다. 헤더가 존재하는지 검사 할 필요가 없습니다. 코드가 컴파일되었으므로 컴파일러가 헤더를 발견했습니다.

MFC (즉, CWnd 구현을 포함하는 lib)에 대한 링크가 필요합니다. 프로젝트 속성에서

는 설정 :

에 stdafx.h에 관해서는
General > Use of MFC > Use MFC in a Shared DLL 

는, 그것이 미리 컴파일 된 헤더입니다. 당신은 그들 자신을 읽을 수 있습니다. ;) 원하지 않으면 프로젝트 속성에서 해제 할 수 있습니다.

C/C++ > Precompiled Headers > Precompiled Header > Not Using Precompiled Headers 
+0

아쉽게도 프로젝트는 이미 공유 DLL에서 MFC 사용으로 설정되어 있습니다. 아마도 잘못된 버전의 MFC에 연결하고있을 것입니다. 나는 다른 DLL을 나열하는 것으로 보이는 [this] (http://en.wikipedia.org/wiki/Microsoft_Foundation_Class_Library) Wikipedia 페이지를보고있었습니다. CWnd 함수를 이들 중 하나에 포함시켜야합니까? –

+0

나는 MFC90.dll에 대한 검색을 수행하고 다른 파일 크기로 내 컴퓨터에 11 개의 사본을 찾았습니다. 그 중 9 개가 WinSxS 디렉토리에 있고, 그 중 4 개가 x86 MFC 배포본의 다른 버전 인 것으로 보입니다. 이들 중 두 개는 위키피디아 목록에 없습니다. SxS 디렉토리에없는 2 개의 MFC90.dll 파일은 Visual Studio 디렉토리에 있으며, 그 중 하나는 x86 용인 것처럼 보입니다. 연결할 대상을 어떻게 지정해야합니까? 다시 말하지만, 어쨌든 올바른 파일을 찾으면 실제로 어떻게 IDE에 링크를 수행하라고 말합니까? 모든 질문에 대해 유감스럽게 생각합니다! –

+0

흠, 그래서이 MFC90.dll 파일 각각에 대한 경로를 프로젝트 속성 -> 구성 속성 -> 사서 -> 일반 -> 추가 라이브러리 디렉토리에 추가하려고했습니다. 프로젝트가 성공적으로 컴파일 될 때마다 (단순히 최신이라고 말하기보다는) 동일한 링커 오류가 발생했습니다. 필자는 amd64 라이브러리 중 하나를 실제로 라이브러리에서 컴파일하고 있는지 확인하기로 결정했습니다. 그러나, 그것은 또한 성공했다. 그것은 실제로이 코드를 포함하고 있지 않다는 것을 말해 준다. 다시 말하면, IDE에게 무엇을 연결해야하는지 어떻게 말합니까? –