① C++MFC和win32控制台,见详情
先新建一个MFC工程, 选择“基于对话框”比较容易上手。
然后直接编译运行,就可以看见界面了。
到资源编辑器,找到编辑对话框的界面。 工具箱里面拖一个按钮到界面上,双击,出现代码界面,就可以往里面写代码。 入门基本就是这样。
深入的话 这不是一两句话可以说清的。 MFC 是微软的库,和整个乎漏竖windows系统密切耦合搜旁。 需要了解许多系统架构方面的内容 各种系岁大统调用 才能融会贯通。
② VS2008 VC++/MFC 出错LNK2001与1120
错误 LNK1120 为您提供该链接的无法解析的外部对象数 (number)。导致无法解析的外部对象的条件由错误 LNK2001 描述,此错误出现在该错误信息之前(对每个无法解析的外部对象都出现一次)。
//就是说每出现一次LNK1120都会在之前出现一个LNK2001
LNK2001
所以主要是解决LNK1120关键是要解决链接器工具错误 LNK2001 这分一下的情况(来自VS 2008的帮助),在这里我只复制一些比较常见的,如果还不行,你重建工程来吧~~
一、代码问题
1.如果 LNK2001 诊断文本报告 __check_commonlanguageruntime_version 是无法解析的外部符号,在 function 中找到了未定义的外部符号 (symbol)。若要解决此错误,请提供符号定义或移除引用它的代码。
2.成员模板的定义超出了类的范围。Visual C++ 的一个限制是,成员模板的定义必须完全位于封闭类内。
3.代码中大小写不匹配
4.如果项目使用函数内联,但在 .cpp 文件而非头文件中定义函数,则会导致 LNK2001。
5.试图引用没有外部链接的函数或数据会导致 LNK2001。
6.缺少函数主体或变量会导致 LNK2001。
7.调用参数类型与函数声明中的参数类型不匹配的函数会导致 LNK2001。名称修饰将函数参数合并到最终修饰函数名中。
8.错误包含的原型导致编译器需要没有提供的函数体,这样会导致 LNK2001。如果同时具有函数 F 的类实现和非类实现,请注意 C++ 范围解析规则。
9.在使用 C++ 时,将函数原型包含在类定义中但未能包含实现(该类的此函数的实现)会导致 LNK2001。
10.试图从抽象基类的构造函数或析构函数调用纯虚函数会导致 LNK2001。纯虚函数没有基类实现。
11.试图在函数范围外使用用该函数声明的变量(局部变量)会导致 LNK2001。
二、编译和链接问题
1.项目缺少对库 (.LIB) 或对象 (.OBJ) 文件的引用。有关更多信息,请参见用作链接器输入的 .lib 文件。
2.如果使用 /NODEFAULTLIB 或 /Zl,包含所需代码的库将不会链接到项目,除非已显式地包括了这些库。(在使用 /clr 或 /clr:pure 进行编译时,您将看到对 .cctor 的引用;有关更多信息,请参见 混合程序集的初始化。)
3.如果正在使用 Unicode 和 MFC,如果没有创建 wWinMainCRTStartup 的入口点,将在 _WinMain@16 上得到无法解析的外部对象;请使用 /ENTRY。请参见 Unicode 编程摘要。
4.将用 /MT 编译的代码与库 LIBC.lib 链接会在 _beginthread、_beginthreadex、_endthread 和 _endthreadex 上导致 LNK2001。
5.链接需要多线程库的代码(任何 MFC 代码或用 /MT 编译的代码)会在 _beginthread、_beginthreadex、_endthread 和 _endthreadex 上导致 LNK2001。有关更多信息,请参见下列知识库文章:
6.在用 /MD 进行编译时,因为所有的运行时现在都存放在一个 DLL 中,所以源中的“func”引用在对象中变为“__imp__func”引用。如果试图与 LIBC.lib 或 LIBCMT.lib 静态库链接,则将在 __imp__func 上得到 LNK2001。当不用 /MD 进行编译时,如果试图与 MSVCxx.lib 链接,则并非总是得到 LNK2001,但可能会有其他问题。
7.在生成应用程序的调试版本时与发布模式库链接会导致 LNK2001。同样,使用 /Mxd 选项(/MTd 或 /MDd)和/或定义 _DEBUG,然后再与版本库链接,将可能会产生无法解析的外部对象(同时还会出现其他问题)。将发布模式生成与调试库链接同样会导致类似问题。
8.将 Microsoft 库版本和编译器产品版本混合可能会有问题。新编译器版本的库可能包含早期版本的库中没有的新符号。可能需要更改搜索路径中的目录顺序,或将它们更改为指向当前版本。
9.使用库文件选择下的“工具”|“选项”|“项目”|“VC++ 目录”对话框,可以更改搜索顺序。项目的“属性页”对话框中的“链接器”文件夹可能也包含可能已过期的路径。
10.当安装了新的 SDK(可能在不同的位置),但没有将搜索顺序更新为指向新位置时,可能会出现此问题。通常情况下,应将新 SDK 的 include 目录和 lib 目录的路径放在默认 Visual C++ 位置的前面。另外,包含嵌入路径的项目可能仍然指向旧路径,这些路径是有效的,但对于安装到不同位置的新版本所添加的新功能已过期。
11.编译器供应商之间、甚至同一编译器的不同版本之间当前没有 C++ 命名标准。因此,链接用其他编译器编译的对象文件可能无法生成相同的命名方案,从而导致错误 LNK2001。
12.在不同模块上混合内联和非内联编译选项会导致 LNK2001。如果创建 C++ 库时打开了函数内联(/Ob1 或 /Ob2),但描述函数的相应头文件的内联是关闭的(没有 inline 关键字),则将发生此错误。若要防止此问题,请在要包含到其他文件中的头文件中用 inline 定义内联函数。
13.如果使用 #pragma inline_depth 编译器指令,请确保具有 设置为 2 或更大的值,并确保使用 /Ob1 或 /Ob2 编译器选项。
14.在创建纯资源 DLL 时省略 LINK 选项 /NOENTRY 将导致 LNK2001。
15.使用不正确的 /SUBSYSTEM 或 /ENTRY 设置会导致 LNK2001。例如,如果编写基于字符的应用程序(控制台应用程序)并指定 /SUBSYSTEM:WINDOWS,您将得到无法解析的 WinMain 外部对象。有关这些选项和入口点的更多信息,请参见 /SUBSYSTEM 和 /ENTRY 链接器选项。
初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:
unresolved external symbol “symbol”(不确定的外部“符号”)。
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
以下是可能产生LNK2001错误的原因:
一.由于编码错误导致的LNK2001。
1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如, 如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。
2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。
3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。
4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。 静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
函数内声明的变量(局部变量) 只能在该函数的范围内使用。
C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种方法是使用时给该变量赋以常数。
二.由于编译和链接的设置而造成的LNK2001
1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导致错误LNK2001。
2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。
4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的问题。
6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。
7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。
其实,产生LNK2001的原因还有很多,以上的原因只是一部分而已,对初学者来说这些就够理解一阵子了。但是,分析错误原因的目的是为了避免错误的发生。LNK2001错误虽然比较困难,但是只要注意到了上述问题,还是能够避免和予以解决的。
③ 如何在MFC中获取编辑框信息调用控制台程序并输出到编辑框中
写了个例子。
假设你有这历悉么一个程序
#include <stdio.h>
int main() {
int a, b;
scanf("%d%d", &a, &b);
printf("%d", a+b);
return 0;
}
编升孝译吵烂稿成add.exe
然后你看附件里的代码是怎么调用的
④ vs2008 MFC问题编译无法通过
你是在控制台里面建立的,自然会有问题。
右键该工程--属性---常规 --项目默认余逗值腔颤--MFC的使用----在共享DLL中使用MFC,一定要设这一步。
更好的方法是你建立一个MFC程序,把里面的.H和 CPP文件统统删了,再自伍毁败己建立CPP等。
⑤ MFC与win32控制台编写的程序有什么区别 求指教
WIN32 程旅旁序和MFC 程序生成的都是Windows应用程序。不同的是,Win32程序使用Windows SDK框架生成应用程序框架,默认该框架程序不使用MFC(微软基础类),生成的都是面向过程的程序框架,程序的入口时WinMain,使用这个框架需要对Windows SDK程序比较熟悉;MFC程序,可以选择单文档、多文档和对话框亩敬的应用程序框架,该框架支持MFC,生成的程序框架,都是拆耐橡C++面向对象的应用程序,程序的入口是CXXXApp。
⑥ c++控制台程序转成mfc图形界面的,那么程序里面的cout输出流到mfc里怎么转换
在界面上定义一个EditBox(CEdit类)或者StaticText(CStatic类)控件,使用该类的SetWindowText成员函数把文本写到漏尘好控件中显示。
控制台终端的输出流的话,可以用strstream 或stringstream 代替iostream 作为流,流输出完成后,生成的字符串都在流缓返铅冲中,程序可以直接把流缓冲的内容写到控件中。
注意,老的编译器可兄碰能不支持 stringstream,就只有使用 strstream 了,用法可以到网上搜索,例子很多。
⑦ MFC调用DLL崩溃
很明显程序里发生了断点,具体问题还要看代码才行。
⑧ 求指点,把一个VC编译通过可以运行的控制台程序移植到MFC出错
MFC是框架嵌套的,默认包含了很多(几乎所有win32)的头文件和MFC框架头文件,所以几睁顷乎所有的系统级include都不需要了。还有很多类型的定义,也是都有了,这个要看具体情况,一般建议先都不要悉笑陆,哪个不认识再加上哪个。
赋值语句类型错误。。其实一般都是语法规范不够好,在不同的编译环境下容错不一样。不过还有一种可能就是,两个模式下,对变量的升枝定义有差别造成的。具体问题具体看吧,你的貌似是函数类型报错,不是变量赋值。
⑨ 如何在mfc控制台输出调试信息
简单来说,有两种方式,一种是源码debug,即分析源码来找出bug位置,一般使用printf()打印出程序执行每一步的信息,一种是可执行文件debug,需要使用调试器来进行。1.源码debug。类似于下面的源码,主要通过程序执行时输出的信息,来定位bug出现的位置,然后再修改源码。例如:#includevoidf(){;}intmain(){#ifdef_DEBUGprintf("startmainfunction!\n");#endifvoidf();#ifdef_DEBUGprintf("leavemainfunction!\n");#endifreturn0;}2.可执行文件调试,windows平台常用的就是vs/vc自带的调雹笑试,另外一个态肆竖就是微软自家开发的调试器windbg。Linux平台以gdb为常用。下面以dev-C++为例:1)在逗工具地-》编译选项-》"编译时加入以下命令"下面的编辑框里加上:-g32)在下面的"在连接器命令行加入以下帆大命令"下的编辑框上加上:-g33)转到程序页,把gcc行修改为:gcc.exe-D__DEBUG__,4)把g++行修改为:g++.exe-D__DEBUG__,5)点击确定,重新编译,就能调试了。
⑩ visual C ++与MFC的关系
楼主的问题已经好多人回答了,鉴于自己上学时也在这些问题上纠结过,忍不住也想恢复下 ^_^
楼主应该打开过 VC 这个软件吧,你可以看一下新建工程的时候,有好多项目类型可以选择,例如,win32应用程序,win32控制台,MFC应用程序等等,所以 VC 只是一个开发环境,你可以选择使用MFC,也可以选择不使核银纤用MFC写你的软件。MFC是微软提供的一套类库,是一个类的集合,统称MFC,楼主学过数据结构的话,应该知道链表,队列,map等等这些东西,C语言里用char*,C++里用string表示字符串,MFC对这些都有自己的封装 CArray,CMap,CString等。
但是,MFC重要且常用的一部分是对窗口的封装。CWnd,CDialog,CButton等等。我们拿软件上的按钮来说,不适用MFC,直接用Win32 的API 函数来创建,我们要用CreateWindow函数先创建出来,还要计算按钮的大小,位置等等。但是用MFC,我们想创建一个按钮,直接在工具箱里拖到界面上,调整位置和大小也就是动动鼠标的事,一句代码不用写就出来了。这也是MFC的优越之改仿处。
那么,我们一般说的 windows 程序设计,和 MFC 程序是什么关系呢?其实,一般我们说的windows程序就是不使用MFC类库里的东西,直接用 API 写的程序,显而易见,我们创建一个按钮就需要写函数,计算位置等等这些过程,要是建一个复杂的界面,肯定要写很多代码。MFC的程序当然就是使用了MFC的程序了。
MFC 关于窗口这一块的封装,其实就是封装的 win32 API。像MFC里CWnd这样的窗口类,最后还是调用的 API 函数 CreateWindow,只是微软为了方便开发人员快速的开发软件,帮我们处理了,借助 VC 和 MFC 给我们一个所见即所得环境。
直接用 Win32 API 编程类似于 C 语言的面向过程编程,还是因为MFC为了方便我们开发,通过一些封装等手段,使得搏租我们开发应用程序,能以面向对象的方式开发了。
C++重要的地方在于这种面向对象的思想,MFC又何尝不是C++思想的一个实现?我们用C语言编程,显示一个东西用 printf,在C++里可能用 cout 这些函数还不都是 C,或者C++ 的库提供给我们的? 在VC下开发,别管用不用MFC,只要包含了 C 或者 C++ 的头文件,链接了库文件,都是可以使用的。
虽然 MFC 提供了这么方便的开发方式,但是在方便的同时,MFC隐藏的细节太多,使我们看不清程序后面的机制了,上面说,MFC是对 win32 API 的封装,所以要想清楚的知道窗口是怎么出来的,又是怎么响应用户的,还是要从 windows 编程开始。
个人推荐,先看,windows程序设计,再学习MFC,起码先把windows编程关于创建窗口,消息处理搞明白以后再看MFC,既然MFC封装的就是这些东西,你把MFC底层的细节了解一二了,还怕学不会MFC? 希望能帮到楼主 ^_^