清泛IT社区

标题: 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反) [打印本页]

作者: 清泛网    时间: 2016-04-22 11:36
标题: 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
现象&原因:
当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。


解决:
1、不使用预编译头文件(不推荐,因为使用预编译头可以使总的编译时间大大减少,工程小倒无所谓)
工程右键“属性”:
(, 下载次数: 2483)

不过有个变通的方法,即只针对单个c文件不使用预编译头文件,其他文件保持不变:
(, 下载次数: 2507)
c文件右键“属性”,设置界面同上。



2、方案二:使用静态lib库。

方案2:影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目总体的编译速度大大降低,得不偿失。这时考虑可以为这组文件建立专用的预编译头。在 VC++ 极早期版本(1.5及以前版本)中是支持单个工程中建立分别针对 .c 和 .cpp 的预编译头的,但之后的版本中只支持单独的预编译头。在这种情况下,我们可以在workspace(或 solution)中建立一个新的静态链接库 (Static Library) 工程,将所有的 .c 文件独立出来加入到该工程中单独编译,这样就可以在该静态链接库中针对 .c 文件创建预编译头。但是这样做在一定程度上需要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来说,这个要求一般是满足的,否则就应考虑下项目的总体设计了:P 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。方法如下:

点击菜单命令    “项目/属性”,弹出项目属性对话框;或者在解决方案视图或类视图中,右击项目名称,选“属性”,弹出项目属性对话框;在弹出对话框的活动配置中,选择 “配置属性/链接器/输入/附加依赖项”,即可输入待加入的lib库文件,添加完毕点击“应用”或“确定”按钮。如果要对所有的配置添加lib库文件,可先将活动配置切换为“所有配置”。

              在“配置属性”---“连接器”---“常规”的“附件库目录”填上库所在的目录名,这个目录名最好是在工程文件夹中建一个专门放lib的文件夹。








欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3