当前位置:C++技术网 > 资讯 > VS2010常见问题的解决方案

VS2010常见问题的解决方案

更新时间:2015-06-25 13:40:53浏览次数:1+次

    vc++里面的obj文件是什么文件
    Project(项目)中每个cpp经编译成为obj(object)目标文件,所有obj文件和资源文件经链接(link)成为可执行文件,obj文件可称为目标文件或中间文件。另外,obj文件只给出了程序的相对地址,而EXE是绝对地址。
    那是程序被编译后产生的二进制文件,不能打开,你想执行程序的话直接打开对应程序的.exe文件就可以了,也可以打开.cpp文件重新编译一下运行,但二进制文件时不能打开的,即使打开了也是乱码。

    报错分析与纠正:

error C3872: "0xa0": 此字符不允许在标识符中使用??
error  C3872: '0xa0': this character is not allowed in an identifier 或者error C3872: "0xa0": 此字符不允许在标识符中使用
     这是因为直接复制代码的问题。0xa0是十六进制数,换成十进制就是160,表示汉字的开始。


    解决办法:在报错的代码行检查两边的空格,用英文输入法的空格替换掉。
    万恶的网络,万恶的word,这些无厘头的错误都是你们搞出来的!!

error C2065: “IDR_MAINFRAME”: 未声明的标识 这个怎么解决??


    应该是图片资源,勿删除了,重新添加一个.ico的资源,并把ID改为 IDR_MAINFRAME 即可,或者自己添加一个ICON资源,资源名命为IDR_MAINFRAME

    很明显m_ImageList 是CImageList类。
    一个“图象列表”是相同大小图象的集合,每个图象都可由其基于零的索引来参考。图象列表用于高效管理大量的图标或位图。图象列表中的所有图象都包含在屏幕设备格式的一个简单的、宽的位图中。一个图象列表还可能包括一个包含用于透明地绘图的掩码的单色位图(图标风格)。Microsoft Win32应用编程接口(API)提供图象列表函数,可以绘图、创建和销毁图象列表、添加和删除图象、替代图象、合并图象和拖动图象。
    CImageList 类提供Windows普通图象列表控件的功能。此控件(为此CImageList 类)只对运行在Windows 95和Windows NT 3.51以上的版本的程序有效。

    如何彻底删除对话框类:

error C2664:“CreateThread”: 不能将参数 3 从“DWORD (__stdcall *)(void)”转换为“LPTHREAD_START_ROUTINE”
error C2065: 'WM_MOUSEWHEEL' : undeclared identifier
    vs2010缺少或未指定语言特性
错误提示:C:Program Files (x86)Microsoft ASP.NETASP.NET MVC 2Visual Studio 2010SnippetsVB2052ASP.NET MVC 2mvcpostaction.snippet: 缺少或未指定语言特性。
     需要重置vs2010的设置,msdn上的重置方法如下。重置设置在“工具”菜单上单击“导入和导出设置”。在“欢迎使用‘导入和导出设置向导’”页上单击“重置所有设置”,再单击“下一步”。如果要保存当前的设置组合,请单击“是,保存我的当前设置”,指定一个文件名,然后单击“下一步”。- 或 -如果要删除当前的设置组合,请选择“否,仅重置设置,从而覆盖我的当前设置”,然后单击“下一步”。此选项并不删除默认设置,下次使用该向导时仍然可以使用这些默认设置。在“要重置为哪个设置集合”中,从列表中选择一个设置集合。单击“完成”。“重置完成”页将提示您在重置过程中遇到的任何问题。


VC6.0 error LNK2001: unresolved external symbol _main解决办法

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:


unresolved external 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. 编程时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。

    解决方法:

    解决外部符号错误:_main,_WinMain@16,__beginthreadex
    在创建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@
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@
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
   (1)工程建错了,你选择的工程是Win32 console application,入口函数是main/wmain,而你的入口时WinMain/wWinMain();
    修改工程属性,link下的 subsystem:console改成subsystem:windows,或者干脆去掉不写。


    在Project Options中将/subsystem:console改成/subsystem:windows 改了后又出现了如下错误:
(2)

syntax error in option "subsystem:windows/incremental:yes"
     subsystem:windows /incremental:yes,注意中间有个空格
    在我的 程序中也出现了这uyang的错误。那我应该怎么该才可以正确的运行程序,就是第二个应该怎么改


    2. Console子系统设置错误, 提示: 

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@
     控制台项目要使用Console子系统, 而不是Windows, 设置:[Project] --> [Settings] --> 选择"Link"属性页


    3. 程序入口设置错误, 提示:

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@
     通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: [Project] --> [Settings] --> 选择"Link"属性页, 在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版本: 调试阶段使用 error C3872: "0xa0": 此字符不允许在标识符中使用