저는 처음으로 인턴쉽을하고 있는데 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 파일을 잃어 버릴 때이 오류가 발생하는 것처럼 들립니다. 올바른 장소를 다시 가리 키도록하려면 어떻게해야합니까?
윽, 알렉스
이 괴물을 Linux로 가져와야합니까? 내 애도. 'LPCTSTR','DWORD' 등은 실제 C 타입 (타입이 형편 없음)에 대해 "부패"(올바른 용어가 없음) 한 타입 정의입니다. 그것들은 모두 Windows라는 것이므로 결국 포트에 대한 유사한 typedef를 작성하거나 모두 대체해야합니다. – sarnold
링커 오류입니다. 컴파일러 오류가 아닙니다. 시도하고 해결하는 데 사용 된 프로세스는 컴파일러 오류가있는 경우 사용할 프로세스입니다. 모든 오류는 연결해야하는 정적 라이브러리를 찾을 수 없다는 것을 말하고 있습니다. 즉, CWnd :: create 함수의 컴파일을 포함하는 파일을 찾을 수 없습니다. Visual Studio에서 링커 설정 대화 상자로 이동하여 관련 라이브러리를 추가해야합니다. – sashang
CWnd는 MFC의 일부입니다. MFC를 연결하고 있는지 확인하십시오. 최근 VS에 더 익숙한 사람이이를 수행하는 방법을 알려줄 수 있습니다. – Adam