문제

라이브러리와 테스트 도구인 이전 작업 공간을 열었습니다.예전에는 잘 작동했지만 지금은 작동하지 않으며 이전 버전의 코드도 동일한 오류로 작동하지 않습니다.프로젝트를 다시 만들어 보았지만 동일한 오류가 발생했습니다.프로젝트 설정에는 잘못된 것이 없으며 생성된 코드는 기본 앱에서 작동합니다.

나는 대부분의 파일을 제거하고 오류를 생성하기 위해 최소한으로 줄였습니다.불행하게도 이 프로젝트는 프로덕션 코드에서 사용되므로 게시할 수 없습니다.

내가 겪는 LNK2001 링커 오류는 일반적으로 라이브러리를 중단했거나 가상 함수 구현을 잊어버렸음을 의미합니다.그러나 이것은 표준 템플릿 라이브러리의 일부이며 헤더입니다.

IOCompletionPort.obj에 문제가 있는 것으로 나열된 코드는 실제로 사용하지 않습니다. std::string 직접적으로 호출하지만 다음을 수행하는 클래스를 호출합니다. Comms::Exception 받아들인다 std::string 그리고 그 가치는 GetLastError 또는 WSAGetLastError.

오류에 언급된 기능(GetMessage)이 구현되지만 필요한 경우 다른 클래스에서 이를 재정의할 수 있도록 가상 함수입니다.그러나 컴파일러가 이를 Ansi 버전으로 만든 것으로 보이지만 설정에서 이를 제어할 수 있는 옵션을 찾을 수 없습니다.나는 그것이 문제일지도 모른다고 생각하지만 도서관에 대한 옵션이 거의 없기 때문에 확실히 알 수 있는 방법이 없습니다.그러나 두 프로젝트 모두 컴파일러 옵션에 _MBCS를 지정합니다.

--------------------구성:TestComms - Win32 디버그--------- 연결 중...comms.lib (iocompletionport.obj) :오류 LNK2001:해결되지 않은 외부 기호 "공개:가상 클래스 std :: basic_string, 클래스 std :: allocator> __thiscall comms :: exception :: getmessagea (void) const "(? @@ v? $ allocator@d@2 @@ std @@ xz) debug/testcomms.exe :치명적인 오류 LNK1120:1 링크를 실행하는 해결되지 않은 외부 오류 .exe.

TestComms.exe - 오류 2개, 경고 0개

어떤 제안이 있으십니까?나는 이로 인해 아침의 대부분을 잃었고 오후의 대부분도 잃고 싶지 않습니다.

도움이 되었습니까?

해결책

한 가지 가능성은 기호를 바꾸는 Win32 ANSI/유니코드 "이름 변경"에 있습니다. GetMessage 어느 쪽이든 GetMessageA 또는 GetMessageW.세 가지 가능성이 있습니다:

  1. Windows.h가 로드되지 않았으므로 GetMessage 숙박 GetMessage

  2. Windows.h는 ANSI용으로 설정된 기호와 함께 로드되었으므로 GetMessage 된다 GetMessageA

  3. Windows.h는 유니코드용으로 설정된 기호와 함께 로드되었습니다. GetMessage 된다 GetMessageW

두 개의 서로 다른 시나리오를 트리거하는 방식으로 두 개의 서로 다른 파일을 컴파일한 경우 링커 오류가 발생합니다.오류 메시지는 Comms::Exception 클래스는 위의 #2의 인스턴스였습니다. 아마도 windows.h가 로드되지 않은 곳에서 사용되었을 것입니다.

일상적인 일로서 제가 당신을 대신해 할 다른 일들은 다음과 같습니다.

1) 포함 및 라이브러리 경로에 예상하지 못한 내용이 포함되어 있지 않은지 확인하십시오.

2) "빌드 클린"을 수행한 다음 수동으로 확인하고 필요한 경우 추가 개체 파일을 삭제합니다.

3) 프로젝트가 처음 재구축되었을 때의 의미를 의미하지 않는 include 문에 하드코딩된 경로가 없는지 확인하세요.

편집하다:서식과 싸우고 있습니다 :(

다른 팁

@무뚝뚝한:가장 가까이 오셨던 것 같아요.나는 이것을 테스트하지는 않았지만 원래 질문에 답변을 제공했다고 생각합니다.

메시지 받기 Ansi(GetMessageA)와 유니코드(GetMessageW) 간을 전환하기 위해 ifndef 블록에 래핑된 Windows.h의 정의입니다.

프로젝트 설정에서 가져서는 안 되는 항목을 삭제하지 않았다고 가정해 보겠습니다(여기서 User32.lib와 같은 외부 종속성이 있을 것으로 예상됩니다).

체크 도구 | 옵션 | 디렉토리 | 라이브러리 (여기에서 메모리에서 나오는) 그리고 공통된 대단한 품종 Lib 디렉토리가 없도록하십시오 (다시 VC6 없이는 그들이 무엇인지 말할 수 없습니다).

이는 Microsoft가 ANSI와 ANSI를 처리하는 방식의 일반적인 문제입니다.유니코드 API.함수 이름의 'A' 또는 'W' 버전으로 해석되는 함수 이름에 대한 매크로를 정의하여 모두(또는 거의 모두) 수행되므로 네임스페이스/클래스/구조체/열거형/에 식별자를 안전하게 가질 수 없습니다. Windows API 이름과 일치하는 함수입니다.

windows.h 매크로는 다른 모든 네임스페이스에 대해 대략적으로 실행됩니다.

windows.h는 IOCompletionPort.h의 맨 위에 포함으로 선언됩니다. 1개의 파일을 포함하기 위해 7줄이 표시되는 것이 지겨워서 자체 파일을 래핑하고 해당 파일 자체를 포함했습니다.여기에는 몇 가지 추가 #define(예: ULONG_PTR)도 포함되어 있습니다. 기본 앱은 Platform SDK가 설치된 상태에서 컴파일되지 않기 때문입니다.-(

  1. 그것은 확인되었습니다.아무 것도 제자리에 있지 않습니다.
  2. 나는 그렇게 했습니다 - 빌드 디렉토리를 삭제했습니다
  3. 나는 하드 코딩된 경로를 절대 사용하지 않습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top