首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

,LINK : error LNK2001: 无法解析的外部符号 ,代码应该没错啊全部照书抄的啊

2012-12-15 
求助,LINK : error LNK2001: 无法解析的外部符号 ,代码应该没错啊,全部照书抄的啊····求助!!!!!!!!!!!!!!!

求助,LINK : error LNK2001: 无法解析的外部符号 ,代码应该没错啊,全部照书抄的啊····求助!!!!!!!!!!!!!!!!
刚开始学习windows编程,第一个程序就出错,以下是代码:照书抄的,
#include<windows.h>
CHAR szTitle[]="Windows 编程技术01章01例";
CHAR szWindowsClass[]=""EX0101";
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK WndProc(HWND,UNIT,WPARAM,LPARAM);
void MyPrint(HWND hWhd);
int CALLBACK WinMain
(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if(!InitInstance(hInstance,nCmdShow))
{
return FALSE;
}
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
BOOL MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=NULL;
wcex.hCursor=NULL;
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,400,250,NULL,NULL,hInstance,NULL);
if(! hWnd)
{
return FALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd,UNIT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
MyPrint(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
void MyPrint(HWND hWnd)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
char szText[]="手工编写的Windows程序!";
::TextOut(hdc,100,100,szText,lstrlen(szText));
EndPaint(hWnd,&ps);
}


[最优解释]
不是代码问题,
设置问题,
要么就是工程建错,
要么就是没有引入 相关 lib
把错误提示全部 贴出来!
[其他解释]
CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=NULL;
wcex.hCursor=NULL;
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName= szWindowsClass;//szWindowClass
wcex.hIconSm=NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd=CreateWindow(szWindowsClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,400,250,NULL,NULL,hInstance,NULL);
if(! hWnd)
{
return FALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
MyPrint(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}


void MyPrint(HWND hWnd)
{
PAINTSTRUCT ps;
HDC hdc;


hdc=BeginPaint(hWnd,&ps);
char szText[]="手工编写的Windows程序!";
::TextOut(hdc,100,100,szText,lstrlen(szText));
EndPaint(hWnd,&ps);
}



[其他解释]
//总体看就是一些拼写错误,所以只管照着我这个复制就OK。


#include<windows.h>
CHAR szTitle[]="Windows 编程技术01章01例";
CHAR szWindowsClass[]="EX0101";
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void MyPrint(HWND hWhd);
int CALLBACK WinMain
(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if(!InitInstance(hInstance,nCmdShow))
{
return FALSE;
}
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
BOOL MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW
[其他解释]
另外vs2010是不是根本没有“双击错误信息定位到行 ”功能啊,求指点》》》》》
[其他解释]
含这个_WinMainCRTStartup的库没被包含到你的项目里
[其他解释]
回复十楼,怎么把含这个_WinMainCRTStartup的库没被包含到我的项目里,
[其他解释]
现在除去拼写这种错误已经被排除后,你的_WinMainCRTStartup的库没被包含到你的项目里。你确定你建立的是windows项目而非win32控制台项目?win32控制台可不包含_WinMainCRTStartup的库哦。
[其他解释]
刚检查了啊 ,win32项目啊
[其他解释]
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。

关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

[其他解释]
>LINK : error LNK2001: 无法解析的外部符号 _WinMainCRTStartup
说明工程的创建的时候项目设置时错误的。也就是硕你CPP中写的函数与你的运行库中的函数入口时不同类型的。
WinMain和wWinMain两个主函数对应的运行库函数应该是_WinMainCRTStartup和_wWinMainCRTStartup。应该选择Win32项目。
main和wmain两个函数对应的是_mainCRTStartup和_wmainCRTStartup,对应的项目是win32控制台程序,也就是通常看到的cmd窗口程序。
如果刚开始创建的工程项目类型错误有两种修改方法:
一、重新创建工程,重新编写文件(不能添加已有项目文件)。
二、按照12楼的指示修改一下项目子系统属性也可以,但是这种通常在创建了错误类型后在修改时成功率不高。推荐的方法是:子系统类型不选择,让系统自动选择,缺点是编译时间长。

至于其他的有没有语法错误得靠楼主自己了。
[其他解释]
工程创建错了。。

估计楼主建立了控制台应用程序、、、


建议win32 工程、。。楼主
[其他解释]
LZ应该是工程建错了
[其他解释]
看起来应该把WIN32当成 console

在VC6.0中比较无敌的一句 不知道在VC10.0还行不

#pragma comment( linker, "/subsystem:"windows" /entry:"WinMainCRTStartup"" )

放到#include<windows>下一行试下
------其他解决方案--------------------


在建立项目的时候选择"win32项目",然后把下面这些复制到“你的文件名.CPP”文件下面,已经正式在VS2010下可运行了。


#include<windows.h>
// 全局变量:
HINSTANCE hInst;// 当前实例
WCHAR szTitle[25]=L"Windows 编程技术01章01例";// 这里改为宽字符WCHAR 还有字符串前面加上L
WCHAR szWindowClass[7]=L"EX0101";// 这里改为宽字符WCHAR 还有字符串前面加上L
void MyPrint(HWND hWhd);
// 此代码模块中包含的函数的前向声明:
ATOMMyRegisterClass(HINSTANCE hInstance);
BOOLInitInstance(HINSTANCE, int);
LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if(!InitInstance(hInstance,nCmdShow))
{
return FALSE;
}
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}




ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW
[其他解释]
CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=NULL;
wcex.hCursor=NULL;
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=szWindowsClass;
wcex.hIconSm=NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd=CreateWindow(szWindowsClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,400,250,NULL,NULL,hInstance,NULL);
if(! hWnd)
{
return FALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
MyPrint(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
void MyPrint(HWND hWnd)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
char szText[]="手工编写的Windows程序!";
::TextOut(hdc,100,100,szText,lstrlen(szText));
EndPaint(hWnd,&ps);
}

[其他解释]
如果非要说哪里错了的话,给你举两个你这个程序的拼写错误例子看吧
1)::符号你用成了中文的::
2)szWindowsClass你少了个s  比如你抄写成了szWindowClass这样显然是非定义的。
[其他解释]
#include<windows.h>

CHAR szTitle[]="Windows 编程技术01章01例";
CHAR szWindowsClass[]="EX0101";
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

void MyPrint(HWND hWhd);


int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
    MSG msg;
    MyRegisterClass(hInstance);
    if(!InitInstance(hInstance,nCmdShow))
    {
        return FALSE;
    }
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}
BOOL MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
    wcex.cbSize=sizeof(WNDCLASSEX);
    wcex.style=CS_HREDRAW
[其他解释]

引用:
>LINK : error LNK2001: 无法解析的外部符号 _WinMainCRTStartup
说明工程的创建的时候项目设置时错误的。也就是硕你CPP中写的函数与你的运行库中的函数入口时不同类型的。
WinMain和wWinMain两个主函数对应的运行库函数应该是_WinMainCRTStartup和_wWinMainCRTStartup。应该选择Win32项目。
main和wmai……

我和楼主毛病完全一样,但我的工程应该没问题。本来是已经编译好能执行的代码 我添加了一个函数,相应的生命和调用都有,我又编译,没问题,build就出现问题了。error Link 2001.真心求教育啊
[其他解释]
CS_VREDRAW;
    wcex.lpfnWndProc=(WNDPROC)WndProc;
    wcex.cbClsExtra=0;
    wcex.cbWndExtra=0;
    wcex.hInstance=hInstance;
    wcex.hIcon=NULL;
    wcex.hCursor=NULL;
    wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName=NULL;
    wcex.lpszClassName= szWindowsClass;//szWindowClass
    wcex.hIconSm=NULL;
    return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
    HWND hWnd=CreateWindow(szWindowsClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,400,250,NULL,NULL,hInstance,NULL);
    if(! hWnd)
    {
        return FALSE;
    }
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_PAINT:
        MyPrint(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}


void MyPrint(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc;
    hdc=BeginPaint(hWnd,&ps);
    char szText[]="手工编写的Windows程序!";
    ::TextOut(hdc,100,100,szText,lstrlen(szText));


    EndPaint(hWnd,&ps);
}




1>------ 已启动生成: 项目: 66, 配置: Debug Win32 ------
1>生成启动时间为 2012/8/27 16:18:41。
1>PrepareForBuild:
1>  正在创建目录“c:\users\acer\documents\visual studio 2010\Projects\66\Debug\”。
1>InitializeBuildStatus:
1>  正在创建“Debug\66.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1>  66大顺.cpp
1>c:\users\acer\documents\visual studio 2010\projects\66\66\66大顺.cpp(10): error C2731: “WinMain”: 无法重载函数
1>          c:\users\acer\documents\visual studio 2010\projects\66\66\66大顺.cpp(9) : 参见“WinMain”的声明
1>c:\users\acer\documents\visual studio 2010\projects\66\66\66大顺.cpp(37): error C2440: “=”: 无法从“CHAR [7]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\acer\documents\visual studio 2010\projects\66\66\66大顺.cpp(43): error C2664: “CreateWindowExW”: 不能将参数 2 从“CHAR [7]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\acer\documents\visual studio 2010\projects\66\66\66大顺.cpp(73): error C2664: “lstrlenW”: 不能将参数 1 从“char [24]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\acer\documents\visual studio 2010\projects\66\66\66大顺.cpp(73): error C2664: “TextOutW”: 不能将参数 4 从“char [24]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>
1>生成失败。
1>
1>已用时间 00:00:22.65
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

[其他解释]
CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=NULL;
wcex.hCursor=NULL;
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd=CreateWindow(szWindowClass,reinterpret_cast<LPCWSTR>(szTitle),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,400,250,NULL,NULL,hInstance,NULL);//这里有个强制转换需要注意
if(! hWnd)
{
return FALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
MyPrint(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
void MyPrint(HWND hWnd)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
WCHAR szText[]=L"手工编写的Windows程序!";// 这里改为宽字符WCHAR 还有字符串前面加上L
::TextOut(hdc,100,100,reinterpret_cast<LPCWSTR>(szText),lstrlen(reinterpret_cast<LPCWSTR>(szText)));//这里有两个个强制转换需要注意
EndPaint(hWnd,&ps);
}



------其他解决方案--------------------


1 CHAR szWindowsClass[]="EX0101";
2 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
3 wcex.lpszClassName=szWindowsClass;
4......
调试方法 双击错误信息定位到行 自己找错误信息 发现你好多都拼错了
[其他解释]
回复二楼三楼,我把您的复制过去,结果错误是如下:求指点!!!
1>------ 已启动生成: 项目: miaomiao, 配置: Debug Win32 ------
1>生成启动时间为 2012/8/26 1:01:00。
1>InitializeBuildStatus:
1>  正在对“Debug\miaomiao.unsuccessfulbuild”执行 Touch 任务。
1>ManifestResourceCompile:
1>  所有输出均为最新。
1>LINK : error LNK2001: 无法解析的外部符号 _WinMainCRTStartup
1>c:\users\acer\documents\visual studio 2010\Projects\miaomiao\Debug\miaomiao.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:00.49
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

[其他解释]
回复四楼,我用的是vs2010专业版,好像不能“双击错误信息定位到行”啊,然后,我用的系统是win7旗舰版,VsualC++6.0不能用啊,怎么办啊
[其他解释]
确实是有很多拼写错误。拼写错误的地方4楼已经说了
以下是我改正的。能运行


#include<windows.h>

CHAR szTitle[]="Windows 编程技术01章01例";
CHAR szWindowsClass[]="EX0101";
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

void MyPrint(HWND hWhd);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if(!InitInstance(hInstance,nCmdShow))
{
return FALSE;
}
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
BOOL MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW
[其他解释]
回复八楼:照你的复制过去,还是错啊,我把错误贴出来,麻烦您分析分析
1>------ 已启动生成: 项目: 1234, 配置: Debug Win32 ------
1>生成启动时间为 2012/8/26 11:42:09。
1>PrepareForBuild:
1>  正在创建目录“c:\users\acer\documents\visual studio 2010\Projects\1234\Debug\”。
1>InitializeBuildStatus:
1>  正在创建“Debug\1234.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>LINK : error LNK2001: 无法解析的外部符号 _WinMainCRTStartup
1>c:\users\acer\documents\visual studio 2010\Projects\1234\Debug\1234.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:03.54
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

[其他解释]
引用:
回复十楼,怎么把含这个_WinMainCRTStartup的库没被包含到我的项目里,

你建的是win console application么,项目属性linker, subsystem,改成windows
[其他解释]
引用:
刚检查了啊 ,win32项目啊

大哥大姐 我在13楼的回复的意思是你的建的工程肯定建错了。所以就没有错误提示上的库。
------其他解决方案--------------------


楼主可以建win32项目。应该用到的库都包含在里面了。对于显式强制转换可以用reinterpret_cast<LPCWSTR>(你要转换的内容)进行转换,不过我也遇到这样的错误都改正后,虽然最后没有错误了,但是仍得不到最终想要的结果。(我在VC++6.0上已经运行了符合题意的结果,但是在VS2010上就遇到了与楼主类似的问题)
[其他解释]
还是有问题,大家能不能推荐我几本一vs2010为基准的windows编程类书啊,我借的书里面的编译环境和vs2010有点不大一样啊还,谢谢谢啦
[其他解释]

//这是成功后的截图

热点排行