2016-11-05 3 views
-2

왜 이런 일이 일어나는 지 아는 사람이 있습니까? 나는 마이크로 소프트 (R) 증분 링커 버전 14.00.24215.1로 컴파일하고 "CL/EHsc의 winbasicb.cpp"의 명령 줄 입력을위한 명령 줄에서 "/ EHsc"옵션을 사용하여 사용하고WINDOWS api가 외부 기호를 확인할 수 없음

#define _x64 

#include<Windows.h> 
#include<iostream> 
#include<windef.h> 
#include<Winuser.h> 
#include<tchar.h> 
using namespace std; 

int WINAPI MessageBoxW(
_In_opt_ HWND hWnd, 
_In_opt_ LPCTSTR lpText, 
_In_opt_ LPCTSTR lpCaption, 
_In_  UINT uType 
); 
int main(){ 
    cout << MessageBoxW(NULL,L"",L"",0); 
} 

. 나는 아무것도 느끼지 않는다. 컴파일과 링크 최적화를 위해/EHsc 옵션을 사용합니다.

이 오류가 발생합니다.

/out:winbasicb.exe 
winbasicb.obj 
winbasicb.obj : error LNK2019: unresolved external symbol __imp_MessageBoxW referenced in function main 
winbasicb.exe : fatal error LNK1120: 1 unresolved externals 
+0

'L "..."는 유니 코드 문자열을 나타냅니다. –

답변

3

Windows에는 거의 모든 Windows API 함수의 두 가지 버전이 있습니다.

this reference page의 "요구 사항"섹션이 표시되면 MessageBoxWMessageBoxA 기능이 하나씩 있음을 알 수 있습니다. 기호 MessageBoxUNICODE 매크로에 따라 실제 함수 중 하나로 정의 된 매크로입니다.

MessageBoxW 함수는 문자열을 넓은 문자열로 간주하므로 사용자가 전달합니다. 불행히도 올바른 유니 코드 설정이없는 것 같아서 ANSI (좁은 문자, 일반 char) 버전 MessageBoxA이 대신 사용됩니다.

두 가지 해결책이 있습니다. 올바른 유니 코드 설정인지 확인하십시오. 또는 명시 적으로 MessageBoxW으로 전화하십시오. 또는 넓은 문자열을 사용하지 마십시오 (예 : L 접두어).

+0

제 컴파일러는 기본적으로 UTF-8을 사용합니다. 그래서 메모장에서 이것을 다시 작성하여 ANSI로 저장했지만 여전히 형식이 호환되지 않는다고 말합니다. 나는 MessageBoxA와 MessageBoxW를 마찬가지로 시도했다. 아직도 컴파일 할 수 없습니다. –

+0

@ 1911Soldier 대신 좁은 문자열을 전달하려고 했습니까? 문자열에'L' 접두어를 사용하지 않으면됩니다. –

+0

* "거의 모든 Windows API 함수 중 두 가지 버전이 있습니다"* - 정확하지 않습니다. 문자열 인수가있는 API 함수에만 두 가지 버전이 있습니다. 예를 들어 [GetProcAddress] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212.aspx)에는 좁은 문자열 버전 만 있습니다. , [ReadDirectoryChangesW] (https://msdn.microsoft.com/ko-us/library/windows/desktop/aa365465.aspx)에는 와이드 문자 버전 만 있습니다. – IInspectable

0

TCHAR 버전을 MessageBox()이라고 부릅니다. 변환 오류 메시지는 유니 코드 문자열을 MessageBoxA()으로 전달한다고 불평합니다. 대신 Ansi 문자열이 필요합니다. 즉, UNICODE이 정의되지 않은 상태에서 프로젝트가 컴파일되고 있으므로 TCHARchar에 매핑되고 MessageBox()MessageBoxA()에 매핑됩니다. 그러나 L 접두사는 Ansi 리터럴이 아닌 유니 코드 리터럴을 만드는 데 사용됩니다. 위한 동일한 코드베이스를 컴파일하는 경우에만 사용되어야 그렇지

int msgboxID = MessageBox(
    NULL, 
    TEXT("temp.txt already exists.\nDo you want to replace it?"), 
    TEXT("Confirm Save As"), 
    MB_ICONEXCLAMATION | MB_YESNO 
); 

합니다 (TCHAR 함수로부터 얻어 TCHAR 채로 :

TCHAR 기반 기능 문자열 리터럴을 전달 적절한 문자 인코딩을 보장하기 TEXT() 매크로 사용 모두 Win9x의 경우는/ME 및 NT4 + 윈도우 가족), 직접 대신 ANSI 또는 유니 코드 기능을 사용

int msgboxID = MessageBoxA(
    NULL, 
    "temp.txt already exists.\nDo you want to replace it?", 
    "Confirm Save As", 
    MB_ICONEXCLAMATION | MB_YESNO 
); 

int msgboxID = MessageBoxW(
    NULL, 
    L"temp.txt already exists.\nDo you want to replace it?", 
    L"Confirm Save As", 
    MB_ICONEXCLAMATION | MB_YESNO 
); 
+0

이렇게 컴파일 할 수 있습니다. –

+0

#include #include #include #include using namespace std; int WINAPI MessageBoxW( _In_opt_ HWND hWnd, _In_opt_ LPCTSTR lpText, _In_opt_ LPCTSTR lpCaption, _In_ UINT uType ); int main(){ }

관련 문제