创建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
各类项目的入口点:
• |
main:控制台项目 |
• |
WinMain:Win32 项目 |
• |
DllMain:Win32 DLL 项目(如果与 CRT 库链接,则无须指定项目,因为它会添加一个默认的 DllMain) |
下面介绍解决的方法:
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:
“C/C++”选项卡,将预处理器定义从 WIN32、_DEBUG、_CONSOLE 和 _MBCS 更改为 WIN32、_DEBUG 和 _WINDOWS
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows
2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol
_WinMain@16控制台项目要使用Console子系统, 而不是Windows, 设置:
“C/C++”选项卡,将预处理器定义从 WIN32、_DEBUG、_WINDOWS和 _MBCS 更改为 WIN32、_DEBUG 和 _CONSOLE
[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版本: 调试阶段使用
之前已经做好了OgreMFC和XtremeMFC两个框架,今天花了点时间融合到一起,效果还不错,比较满意
虽然肯定有Bug,不过留着以后再改吧,呵呵
截图留念吧
今天终于实现了Office07风格的SDI,发图留念下
之前一直出现的运行错误是由于找不到对应资源文件引起的,在rc文件中加入#include "Styles\Office2007Blue\Office2007Blue.rc"就可以找到资源文件了。
另外实现了VS2005里面的ContextSticker
蛮实用的一个功能,代码也简单
//显示ContextSticker
m_paneManager.SetAlphaDockingContext(TRUE);
m_paneManager.SetShowDockingContextStickers(TRUE);
m_paneManager.SetDockingContextStickerStyle(xtpPaneStickerStyleVisualStudio2005);
m_paneManager.SetShowContentsWhileDragging();
项目中要用Xtreme里的DockingPanel实现一些浮动窗口的效果,为了能实现控件自然想到了CDialog,不过把CDialog“填”到Panel里有些小问题,比如说按Esc后Dialog关闭,focus有问题等等。Xtreme中的示例中使用的是CFormView来完成这个功能,想必也是有些道理的,之前的那些问题都没有了。
但是我在自己的Demo程序中创建CFormView却出现了运行时错误。。。创建的代码直接用的Samples里动态创建的代码,应该是没错的,然后就网上找阿找。。。
终于在一哥们的Blog中找到答案了:
CFormView所使用的对话框资源的Style属性一定要设置为Child。试了下果然OK。这害人的属性阿,整整搞一天
想想也是,如果Style属性可以是PopUp的话还真见鬼了呢,以后遇到类似情况要多留个心眼才行
这几天刚接触Xtreme,最开始发现上手挺麻烦的,资料也不是很多,用了会之后发现其实还是满好用的,有UserGuide和实例代码之后,一些基本想要实现的效果就OK了
最开始从官网下载的12.1.0试用版安装之后Deployment安装有问题-_,-还好后来到csdn下载到了标准版,里面还有源码,之前的问题也没了。嘎嘎
第一个做的实例是Create
an application with office style
toolbar,按UserGuide基本就可以了,唯一注意的是把IDR_MIDSAMTYPE改为IDR_MAINFRAME,否则会报编译错。
我的项目里面使用Ogre作为渲染引擎,但是在已经有了的OgreMFC框架里面只要加上#include"XTToolkitPro.h"就报些奇怪的错误:
正在编译...
stdafx.cpp
d:\Program
Files\Codejock Software\MFC\Xtreme ToolkitPro
v12.0.0\Source\Common\XTPVC50Helpers.h(569) : error C2514: “LONG” :
类没有构造函数
d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\PlatformSDK\Include\WinNT.h(259) : 参见“LONG”的声明
d:\Program
Files\Codejock Software\MFC\Xtreme ToolkitPro
v12.0.0\Source\Common\XTPVC50Helpers.h(569) : error C3861: “min”:
即使使用参数相关的查找,也未找到标识符
d:\Program Files\Codejock Software\MFC\Xtreme ToolkitPro
v12.0.0\Source\Common\XTPVC50Helpers.h(569) : error C3861: “max”:
即使使用参数相关的查找,也未找到标识符
d:\Program Files\Codejock Software\MFC\Xtreme ToolkitPro
v12.0.0\Source\Controls\XTMaskEdit.h(37) : fatal error C1903:
无法从以前的错误中恢复;正在停止编译
于是建个MFC的SDI框架慢慢尝试,只在stdafx.h中添加这两个头文件"XTToolkitPro.h","Ogre.h",但就是这样都会报错。
之后颠倒了两个头文件的顺序之后报堆栈大小限制。
倒是这个堆栈限制提醒了我,估计有可能是预编译头里的东西太多了,然后发生些奇怪的问题。索性就只在stdafx.h里包含"XTToolkitPro.h",而"Ogre.h"只在需要的头文件中包含(当然要用define宏来防止重复包含)。果然OK了!
之后着重看了DockingPanel的代码,按Guide的来也就差不多了,不过有个小问题就是icon图标。icon大小必须为16*16,有几个图标那么图标文件就是16n*16,不能多也不能少,否则运行期错误
Panel的用处很多,可以显示View,Dlg还有其他一些乱七八糟的控件。如果做View的话必须重新写一个CXXView类继承自CView类。这个工作量还是挺大的,不过小心点的话也没太多难度。
“时间紧,任务多,定计划,保完成”
牢记这四句话,寒假前顺利完成项目!