VC6.0编译器中混有.c文件时出现fatal error C1853错误解决办法及extern "C"说明
2012-04-26 23:13
337 查看
原出处不详,本文摘自百度文科http://wenku.baidu.com/view/8a3dedd080eb6294dd886c36.html
第一章的sample1,文中提到由于windows底层代码基本上是用c语言编写的,因此新工程里的CPP文件要改为C文件。
但是在编译时出现错误fatal error C1853: "debug/1_1.pch" is not a precomplied header file with this complier......
这个问题还真是头一次遇到,怎么办?百度一下,解决办法如下:
错误原因:
该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。
在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索
MSDN,针对不同的情况,可以有不同的解决方案:
方案1:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled
headers 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置。
方案2:如果受影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目总体的编译速度大大降低,得不偿失。这时考虑可以为这组文件建立专用的预编译头。在 VC++ 极早期版本(1.5及以前版本)中是支持单个工程中建立分别针对 .c 和 .cpp 的预编译头的,但之后的版本中只支持单独的预编译头。在这种情况下,我们可以在workspace(或 solution)中建立一个新的静态链接库 (Static Library) 工程,将所有的 .c 文件独立出来加入到该工程中单独编译,这样就可以在该静态链接库中针对
.c 文件创建预编译头。但是这样做在一定程度上需要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来说,这个要求一般是满足的,否则就应考虑下项目的总体设计了:P 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。
--------------------------------------------------------------------------------------------------------------------------------------
关于extern "C"说明
C/C++中extern关键字详解
c++中的 extern "C"
第一章的sample1,文中提到由于windows底层代码基本上是用c语言编写的,因此新工程里的CPP文件要改为C文件。
但是在编译时出现错误fatal error C1853: "debug/1_1.pch" is not a precomplied header file with this complier......
这个问题还真是头一次遇到,怎么办?百度一下,解决办法如下:
错误原因:
该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。
在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索
MSDN,针对不同的情况,可以有不同的解决方案:
方案1:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled
headers 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置。
方案2:如果受影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目总体的编译速度大大降低,得不偿失。这时考虑可以为这组文件建立专用的预编译头。在 VC++ 极早期版本(1.5及以前版本)中是支持单个工程中建立分别针对 .c 和 .cpp 的预编译头的,但之后的版本中只支持单独的预编译头。在这种情况下,我们可以在workspace(或 solution)中建立一个新的静态链接库 (Static Library) 工程,将所有的 .c 文件独立出来加入到该工程中单独编译,这样就可以在该静态链接库中针对
.c 文件创建预编译头。但是这样做在一定程度上需要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来说,这个要求一般是满足的,否则就应考虑下项目的总体设计了:P 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。
--------------------------------------------------------------------------------------------------------------------------------------
关于extern "C"说明
C/C++中extern关键字详解
c++中的 extern "C"
相关文章推荐
- VC6.0编译器中混有.c文件时出现fatal error C1853错误解决办法
- VC6.0编译器中混有.c文件时出现fatal error C1853错误解决办法
- 关于 "CS0016: 未能写入输出文件" 的解决办法 编译器错误信息: CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/liste
- VC6.0启动”打开文件"对话框出现错误的解决方法
- Ubuntu下使用vim编写makefile文件出现错误 "makefile: *** missing separator. stop ."的解决办法
- SQL安装时出现"挂起的文件操作”错误解决办法
- 用KMP打开视频文件出现"无法创建图表生成器"错误的解决办法
- vs2010中导入OFFICE库文件的类 excel.h,excel.cpp后出现编译错误的解决办法
- Ubuntu下 交叉编译树莓派内核时出现错误“没有那个文件或目录” 的解决办法
- 删除文件出现 数据错误 循环冗余的解决办法
- 打开sln文件出现 “the selected file is not a valid visual studio solution file”错误提示解决办法
- 用JS 调 WebService 的方法中出现 角本错误"WebService未定义"解决办法
- eclipse出现 Some characters cannot be mapped using "GBK" character encoding 错误代码的解决办法
- 使用Openjdk7编译android源码出现"Could not initialize NSS"错误的解决办法
- 编译时出现fatal error C1853: "debug/xxx.pch" is not a precomplied header file with......错误的原因及解决办法(转)
- 关于ASP程序运行出现ADODB.Stream 错误 800a0bbc 写入文件失败 的解决办法!
- 附加数据库时出现,“错误5173:不能使文件与不同的数据库相关。”解决办法
- 在sql2005中附加数据库时出现无法打开物理文件 "F:\ajax\test.mdf"。操作系统错误 5:"5(拒绝访问。)"解决办法
- 安装IIS时出现安装程序无法复制文件提示:0x4b8错误的解决办法
- StarUML启动时候出现"System Error. Code:1722. RPC服务器不可用."错误的解决办法