라이브러리와 테스트 하네스인 오래된 작업 공간을 열었습니다. 예전에는 잘 작동했지만 지금은 작동하지 않으며 이전 버전의 코드도 동일한 오류와 함께 작동하지 않습니다. 프로젝트를 다시 생성하려고 시도했지만 동일한 오류가 발생합니다. 프로젝트 설정에는 아무 문제가 없는 것 같고 생성된 코드는 기본 앱에서 작동합니다.
대부분의 파일을 제거하고 오류를 생성하기 위해 최소한으로 줄였습니다. 안타깝게도 이 프로젝트는 프로덕션 코드에 사용되므로 게시할 수 없습니다.
LNK2001 링커 오류는 일반적으로 라이브러리를 누락했거나 가상 함수를 구현하는 것을 잊어버렸음을 의미합니다. 그러나 이것은 표준 템플릿 라이브러리의 일부이며 헤더에 해당합니다.
IOCompletionPort.obj에 문제가 있는 것으로 표시된 코드는 실제로 std::string
을 직접 사용하지 않지만 Comms::Exception
은 std::string
과 GetLastError
또는 WSAGetLastError
값을 허용하는 클래스를 호출합니다.
오류에 언급된 함수(GetMessage
)가 구현되어 있지만 가상 함수이므로 필요한 경우 다른 클래스에서 재정의할 수 있습니다. 하지만 컴파일러가 이 함수를 Ansi 버전으로 만든 것 같지만 설정에서 이를 제어할 수 있는 옵션을 찾을 수 없습니다. 이것이 문제일 수 있다고 생각하지만 라이브러리에 대한 옵션이 거의 없기 때문에 확실하게 알 수있는 방법이 없습니다. 그러나 두 프로젝트 모두 컴파일러 옵션에서 _MBCS를 지정합니다.
--------------------Configuration: TestComms - Win32 디버그-------------------- 링크... Comms.lib(IOCompletionPort.obj) : 오류 LNK2001: 해결되지 않은 외부 심볼 "공용: 가상 클래스 "입니다. std::basic_string<char,struct std::char_traits
,class std::allocator > __thiscall Comms::Exception::GetMessageA(void)const " (?GetMessageA@? Exception@Comms@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) Debug/TestComms.exe : 치명적 오류 LNK1120: 해결되지 않은 외부 오류 1개 link.exe를 실행하는 동안 오류가 발생했습니다. TestComms.exe - 2 오류, 0 경고
어떤 제안이 있나요? 아침의 대부분을 이 문제로 낭비했고 오후의 대부분도 낭비하고 싶지 않습니다.
한 가지 가능성은 Win32 ANSI/유니코드 '이름-맹글링'을 사용하여 'GetMessage' 기호를 'GetMessageA' 또는 'GetMessageW'로 변환하는 것입니다. 세 가지 가능성이 있습니다:
Windows.h가 로드되지 않았으므로 GetMessage
는 GetMessage
로 유지됩니다.
Windows.h가 ANSI용으로 설정된 심볼로 로드되었으므로 GetMessage
는 GetMessageA
가 됩니다.
Windows.h가 유니코드용으로 설정된 심볼로 로드되었으므로 GetMessage
는 GetMessageW
가 됩니다.
두 개의 다른 시나리오를 트리거하는 방식으로 두 개의 다른 파일을 컴파일한 경우 링커 오류가 발생합니다. 오류 메시지는 Comms::Exception
클래스가 위 2번의 인스턴스라는 것을 나타냅니다. 아마도 windows.h가 로드되지 않은 곳에서 사용된 것일 수 있습니다.
제가 여러분을 대신하여 일상적인 작업으로 다른 작업을 수행합니다:
인클루드 및 라이브러리 경로에 내가 예상하지 못한 것이 포함되어 있지 않은지 확인합니다.
"빌드 클린"을 수행한 다음 수동으로 확인하여 필요한 경우 추가 오브젝트 파일을 삭제합니다.
포함 문에 하드코딩된 경로가 원래 프로젝트를 재빌드할 때의 의미와 다른 경로가 없는지 확인합니다.
편집: 서식과의 싸움 :(
windows.h는 IOCompletionPort.h의 맨 위에 인클루드로 선언되어 있습니다. 파일 하나를 포함하기 위해 7줄을 보는 것이 지겨워서 자체 파일로 래핑하고 그 자체를 포함시켰습니다. 여기에는 또한 플랫폼 SDK가 설치된 상태에서 메인 앱이 컴파일되지 않으므로 몇 가지 추가 #define(예: ULONG_PTR)이 포함되어 있습니다.
이는 일반 문제가 운행에서어떠한 유니코드 api 와 Microsoft 처리됩니까 ANSI vs. 이후 이들은 모두 (또는 거의 모두), & # 39 를 정의하여 수행됨 대한 매크로 함수 이름을 확인하는 A& # 39. # 39, & # 39 또는 W&. 버전의 함수 이름을 가질 수 있는 클래스 / / / / 이넘 안전하게 delaymins 식별자입니다 이름공간이 구조체입니다 일치하는 윈도우 API 함수 이름.
다른 모든 매크로를 통해 이 빈다우스자하 편자에 징을 박은 실행하십시오 네임스페이스을.