WINDOWS API 无法解析外部符号

WINDOWS api can't resolve external symbol

本文关键字:外部 符号 API WINDOWS      更新时间:2023-10-16

有人知道为什么会发生这种情况吗?

#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(){
    std::cout << MessageBoxW(NULL, L"", L"", 0);
}

我使用微软(R(增量链接器14.00.24215.1版进行编译/EHsc";在命令行上的选项用于命令行输入"0";cl/EHsc winbasicb.cpp";。我没有做任何我觉得新奇的事。只需使用/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

我读取错误:无法转换';const wchar_t[13]';到';LPCSTR{aka const char*}';在赋值中,但这没有帮助,因为他们得到了编译器错误,但我得到了链接器错误。在这个问题中,错误是由于使用了MessageBoxW(..., "", "", ...)而不是MessageBoxW(..., L"", L"", ...),但我应该使用L"",但我遇到了链接器错误。

在Windows中,几乎所有的Windows API函数都有两个版本。

如果您看到本参考页的"需求"部分,您将看到有一个MessageBoxW和一个MessageBoxA功能。符号MessageBox是被定义为取决于UNICODE宏的实际函数之一的宏。

MessageBoxW函数希望字符串是宽字符串,这就是您传递的字符串。不幸的是,您似乎没有正确的Unicode设置,因此使用ANSI(窄字符,纯char(版本MessageBoxA

有两种解决方案:要么确保您有正确的Unicode设置。或者通过显式调用MessageBoxW。或者不要使用宽字符串(即去掉L前缀(。

您正在调用MessageBox()TCHAR版本。转换错误消息抱怨您正在将Unicode字符串传递给MessageBoxA(),而CCD_15需要Ansi字符串。这意味着您的项目是在未定义UNICODE的情况下编译的,因此TCHAR映射到charMessageBox()映射到CCD20。但是L前缀用于创建Unicode文字,而不是Ansi文字。

将字符串文字传递给基于TCHAR的函数时,请使用TEXT()宏来确保正确的字符编码:

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只能在编译Win9x/ME和NT4+Windows系列的相同代码库时使用(,直接使用Ansi或Unicode函数:

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
 );