最近新到一家公司任职,编译公司项目的时候出现了一些古怪的编译错误和警告,现将这些错误和警告,以及解决这些错误和警告的方法贴出来。希望对大家有所帮助。
1.warning C4996: “strcpy”被声明为否决的.e:/开发工具/microsoft visual studio 8/vc/include/string.h(73) : 参见“strcpy”的声明.消息:“This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
这个警告算是一个比较典型的较古怪警告了。从VC6.0转到VC8.0以上编译器的朋友都应该遇到过这个警告。造成这个警告的原因是微软在VC8.0(或许7.0也是,我没有用过VC7.0编译器)以上的CRT库中加入了字符串处理的安全函数,凡是需要写缓冲区的字符串函数,都有其相应的安全函数版本,如strcpy(char *dest, char *src), strcpy_s(char *dest, int destsize, char *src)。这些安全函数的作用就是为了防止恶意攻击者使用缓冲区溢出来攻击我们的应用程序,因为在参数中加入了对缓冲区大小的判断,所以这些函数可以截断这些恶意的输入。但这些函数却没有进入C++标准中,所以说如果你的代码想进行移植的话,如从Windows移植到其他平台上,或将源程序放到VC6.0中进行编译,程序是不能正确的通过的。但是如果我们使用标准的字符串函数又会出现警告,真是十分烦人。那解决的方法是什么呢?这里有2个解决方法,其一是禁止C4996的警告,可在"项目属性"->"C/C++"->"禁用特性警告"中输入4996就可以了。但是这种做法不是很理想,因为这样会禁止4996的所有警告。方法二是使用微软的推荐做法,看到警告信息的"use _CRT_SECURE_NO_DEPRECATE"这一句话了嘛,我们可以在"项目属性"->"C/C++"->"预处理器定义"中加入宏_CRT_SECURE_NO_DEPRECATE即可。
2.fatal error C1083: Cannot open precompiled header file: /'*.pch'.
这个错误是由于预编译文件丢失引起的。那什么是预编译文件呢?预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码。
为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间.但它们又不常被修改,是较稳定的,为单独的一个小文件而重新编译整个工程的所有文件导致编译效率下降,因此引入了.PCH文件。
所以我们只需要重新生成PCH文件就行了。我们可在"项目属性"->"C/C++"->"创建/使用预编译头"中选择"创建预编译头(/Yc)",然后重新编译就可以了。
3.'xxxx' 不是内部或外部命令,也不是可运行的程序或批处理文件。Project : error PRJ0019: 工具从"正在执行生成后事件..."。
这个错误是由生成事件引起的。那什么是生成事件呢?生成事件使您可以自定义一个项目的生成。有三种生成事件:预生成事件、预链接事件和生成后事件。生成事件使您可以指定在生成过程中的某个特定时间要进行的操作。例如,在项目生成完成后,可以使用生成事件用 regsvr32.exe 注册一个文件。
可以使用生成事件指定在生成启动前、进行链接前或生成完成后运行的命令。只有当生成成功到达生成过程中的这些时间点时,才执行生成事件。如果生成过程中发生错误,则不会发生生成后事件;如果错误发生在链接阶段之前,则不会发生预链接和生成后事件。此外,如果没有要链接的文件,则不会发生预链接事件。在不包含链接步骤的项目中,也不会有预链接事件。如果没有要生成的文件,则不会发生生成事件。
所以我们需要检查"项目属性"->"C/C++"->"生成事件"中"预生成事件"、"预链接事件"、"生成后时间"的命令行,看一下里面的参数有没有错误。比如我们命令行中有一条命令 "regsvr32.exe *.dll",如果在工程目录下没有该dll,则会出现上述任务。