在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
下面介绍解决的方法:
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows
2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制台项目要使用Console子系统, 而不是Windows, 设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:windows改成/subsystem:console
3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4. 线程运行时库设置错误, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中,
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用
Q:setup was unable to create a DCOM
user account in order to register microsoft visual
Studio/common/tools/vs_ent98/valec.exe提示安装不成功!怎么办?
A:这是Visual Studio的一个BUG,如果你不使用Visual Studio Analyzer,可以在安装
时选择Custom,然后在Enterprise Tools中清除掉Visual Studio Analyzer。再安装就
没有这个
问题了。
如果一定要使用Visual Studio Analyzer,可以在安装后在进行配置工作,
参考微软的Knowledge Base的文章:“Q257413 BUG: Visual Studio "Setup
Was Unable to Not Create a DCOM User A”。
[03]
Q:安装VC后,如何禁止对错误网页的调试?
A:从IE菜单,工具->internet选项->选择高级标签
把里面的"禁止脚本调试"选中就可以了.
[04]
Q: Error spawning cl.exe
A:程序给出提示是说编译的时候找不到CL.EXE这个程序。这主要是VC编译环境
未设置好造成的。一定是你在安装完VC后又移动了VC的安装目录。可以在VC
中重新设计:Tools->Options...打开Options对话框,选中Directories选
项卡,其中有一个Show directiories for下拉列表框,选中Include files
。然后在下面设置正确的包含文件目录。CL.exe默认所在的目录为
C:/MICROSOFT VISUAL STUDIO/VC98/INCLUDE.
[05]
Q:VC6对类成员的智能提示功能很有用,但有时候失灵?
A:你可以先关掉项目,将.clw和.ncb删掉,然后重新打开项目,点击菜单
项View->ClassWizard,在弹出的对话框中按一下“Add All”按钮;重
新Rebuild All。应该可以解决问题
[06]
Q:如何给已有的Project改名字?
A:将该Project关掉。然后以文本格式打开.dsp文件,替换原来
的Project名字即可。
这个操作有一定的危险,建议有经验的网友使用。
一般也可以使用工具修改,百度之。
[07]
Q:VC工作区的classview内怎么经常丢“类”?当建立一个新的类后,原来
的类为何就不见了?
A:删除clw文件,重新建立一下就可以了
[08]
Q:fatal error C1010: unexpected end of file while looking for
precompiled header directive该如何解决
A:如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则
Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中
选中Precompiled Headers,选择Not Using Precompiled headers。确定
如果发生错误的文件原本是该工程中的,则检查该文件头部有没有
#include "stdafx.h"语句,没有的话添加。
如果还不行,也有可能是定义的类或结构体等最后忘了加分号,注意一下
[09]
Q:以前安装过VC,卸载后重新安装不成功怎么办
A:基本上有三个办法解决:
1>.重新安装系统,然后在全新安装VC。
2>.使用绿色免安装版的VC,在版面ftp可以下载。
3>.清除注册表中的vc安装时生成的项,可以手工清除,也可以借助于超级兔子,优
化大师等工具。
[10]
Q:请推荐几个学习VC的站点
A: http://www.csdn.net http://www.codeguru.com
http://www.vccode.com http://www.codeproject.com
http://www.vckbase.com http://www.vchelp.net
[11]
Q:Cannot acess the ClassView
A:将工程文件的只读属性去掉
[12]
Q:ClassView中少了某些类
A:这是Visual Studio的一个BUG,把ncb文件删掉重新打开工程
[13]
Q:代码无误,但不出现提示
A:把ncb文件删掉重新打开工程
[14]
Q:出现C1033 fatal error:Cannot Open programe database xxxxxx.pdb
A:重新编译选Rebuild All
[15]
Q:推荐书籍
A:《VC++技术内幕(第四版)》(Inside Visual C++ 4.0) ,
(Programming Windows 95 with MFC),《MFC深入浅出》(Dissecting MFC),
《windows程序设计》(不分先后)
[16]
Q:VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的
方法
A:
GET App
AfxGetInstanceHandle()
AfxGetApp()
GET Frame->View->Document
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument()
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocumen
t()
GET Menu
CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetMenu();
GET ToolBar,StatusBar
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
CStatusBar * pStatusBa=(CStatusBar*)AfxGetMainWnd()->GetDescendantWind
ow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar*)AfxGetMainWnd()->GetDescendantWindow(AF
X_IDW_TOOLBAR);
Get View from Document
GetFirstViewPosition 和 GetNextView 函数得到指针。
最后提醒:
在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意
将标准句柄转换成自己的类的句柄。
((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。
最后,我要说的是:vc++是一个好工具,更是一个好朋友!