1.错误: error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
解决方法:项目 -> 属性->配置属性->链接器->系统子系统 改为 Windows (/SUBSYSTEM:WINDOWS)
2.错误: error C2664: “MessageBoxW”: 不能将参数 2 从“const char *”转换为“LPCWSTR”
解决方法:将MessageBox(),改为MessageBoxA()
3.错误.LINK : fatal error LNK1000: Internal error during IncrBuildImage
解决方法:项目->属性->链接器->常规 下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”
4.错误:error C3859: 超过了PCH的虚拟内存范围;请使用“-Zm33”或更大的命令行选项重新编译
产生的原因:为了加快boost的编译,使用的预编译头。而且加的boost的头文件比较多,导致pch文件超过了默认值。
解决方法:项目->配置属性->c/c++链接器->命令行,在附加项中输入/Zm300,点击确认即可;
补充:
/Zm(指定预编译头的内存分配限额):确定编译器分配的用于构造预编译头的内存量。格式:/Zmfactor。
factor:一个比例因子,确定编译器用于构造预编译头的内存量。
factor 参数是编译器定义的工作缓冲区的默认大小所占的百分比。 factor 参数的默认值是 100 (%),但您可以指定更大或更小的数量。 在早期版本的 Visual C++ 中,编译器使用几个离散堆,每个堆都有一定的限制。 当前,编译器可根据需要动态增加堆,最多可增加到总堆大小限制,并且只需要固定大小的缓冲区即可构造预编译头。 因此,很少需要 /Zm 编译器选项。
如果在您使用 /Zm 编译器选项时,编译器用完堆空间,发出 C1060 错误消息,则您可能保留了太多的内存。 可考虑移除 /Zm 选项。 如果编译器发出 C1076 错误消息,则伴随的 C3859 消息会指定您在使用 /Zm 编译器选项重新编译程序时应使用的 factor 参数。
factor的值 内存分配限制
10 7.5 MB
100 75 MB
200 150 MB
1000 750 MB
2000 1500 MB
5.错误: error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [31]”转换为“LPCTSTR”
在外面用vs2008编写mfc程序的时候经常要MessageBox("提示信息")函数,在vc6.0是没有问题的,但是在vs2008却会有下面的提示:
error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [31]”转换为“LPCTSTR”
这个错误提示的原因是VS2008默认使用的是UNICODE字符集,在参数转换时会出错
解决方法很简单。
方法一:
MessageBox(_T"你已经提交成功。");
即在参数前加上_T
方法二:
在新建项目时,把使用UNICODE字符集取消,如下图:
方法三:
选择“项目”-》“XXX项目属性”-》“配置属性”-》“常规”选项中,把“字符集”改为“使用多字节字符集”,然后确定。如下图:
摘自:http://www.ourys.com/post/mfc_messagebox_error.html
6.vs2010包含目录中删除继承值
进入目录:
C:\Users\Administrator\AppData\Local\Microsoft\MSBuild\v4.0
使用UE等文本编辑器打开文件
Microsoft.Cpp.Win32.user.props
在<IncludePath></IncludePath>之间
和<LibraryPath></LibraryPath>之间
找到不想包含进VS2010的设定项,删除。
7.vs2008资源视图在另一个窗口打开
解决方法:将Resource.h文件关闭,再去资源视图里点击.rc文件左边的减号即可。
8. error C3861: “_variant_t”: 找不到标识符
解决方法:包含头文件:#include <comdef.h>
9.fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h
解决方法:
错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?
一、概念:
1、预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个“预编译头文件”的时候,则自动从这个编译结果提取需要的信息进行编译。
2、预编译结果文件(Precompiled header file):就是那个用来保存已经编译了的符号信息的文件(.PCH作为后缀)
3、生成预编译结果文件(Create Precompiled header file):我们说源文件A通过文件B“生成预编译结果文件”是指编译A的时候将其中编译B的编译结果保存成预编译结果文件。一般使用向导的话,A文件就是“stdafx.cpp”,B文件是“stdafx.h”。stdafx.cpp中就一行语句:
#include “stdafx.h”
4、使用预编译头(Using precompiled header):我们说某个源文件(a.cpp)通过“stdafx.h”来使用预编译结果是指编译a.cpp的时候,如果a.cpp第一行include语句是#include “stdafx.h”的话,那么直接取预编译结果文件的结果,不再重新编译”stdafx.h”
二、向导是怎么做的?
1、设置“stdafx.cpp”的预编译选项是通过“stdafx.h”文件来“生成预编译结果文件”。
2、其他源文件的预编译选项设置是通过“stdafx.h”来“使用预编译头”
三、使用原则?
1、将相对稳定的头文件(比如CRT,STL,第三方固定的库)全部写在stdafx.h中。(是否使用stdafx.h依赖个人喜好,不过使用stdafx.h可以和向导保持一致)
2、全部源文件第一行都加#include “stdafx.h”。
3、一些不能修改的源文件(如果公共的代码,不具备权限修改的代码),设置他的预编译选项是“不使用预编译头”。注意,一定不能是选择“自动生成预编译头”,因为这样会将stdafx.h的结果冲掉(这个不知道是BUG还是设计的问题了,.^_^。)。
四、Q&A
Q、为什么不全部使用“自动生成预编译头文件”?
A、“自动生成预编译头文件”和什么都不用没有什么两样,编译速度没有质的提高。
Q、手工添加一个新的源文件到项目的时候,经常出现类似错误:
fatal error C1010: unexpected end of file while looking for precompiled header directive
A、因为向导缺省的设置是“使用预编译头”,但是你新加的文件并没有在第一行包含“stdafx.h”。解决的方法要么修改成“不使用预编译头”,要么添加一行#include “stdafx.h”
Q、加stdafx.h和stdafx.cpp总觉得是和编译平台绑定了,不具备移植性?
A、其实,注意一下stdafx.h的写法就没有问题了。我的解决方案是(stdafx.h的内容):
–begin of file stdafx.h
#ifdef _WIN32
#include “win.h”
#else
#include “linux.h”
#endif
#include “crt.h”
#include
–end of file
或者更加简单一点,如果不是VC编译器,那么stdafx.h就什么内容都不写!
转自:http://blog.sina.com.cn/s/blog_58649eb30100th2k.html