VS系列编译问题总结:
1、无法打开预编译头 Debug\XXX.pch 无法解析的外部符号 "int __cdecl _AfxInitManaged(void)"
分析:pch文件是预编译文件,它由stdafx.h和stdafx.cpp文件生成,用来预编译一些不易改动的文件,调高编译速度。在网上很多人给的解决方案都是设置【C/C++】-> 【预编译头】->【预编译头】:不适用预编译头 这种方式只是用与一些原本的工程就是好用的,清理后出问题的。(首先你需要确保你使用的第三方库文件*.lib已经添加到依赖项中,否则无法解析外部符号就很正常了)
然而问题没有这么简单,比如我的工程是从其他项目COPY的纯代码(只有C/CPP和H文件),所以根据预编译头的思路进行了如下尝试:
第一步:既然没有预编译头文件,我们需要生成,而生成预编译头需要stdafx.h/.cpp文件的支持,所以,首先设置整个工程
【右键】->【属性】->
【C/C++】-> 【预编译头】->【预编译头】:创建(/Yc),
然后 在 工程中单独选择 stdafx.cpp
【右键】-> 【编译】,
第一步完工。
第二步:
设置 整个工程
【右键】->【属性】->
【C/C++】-> 【预编译头】->【预编译头】:使用(/Yu), 然后 【重新编译整个工程】,
这时发现问题变为:
无法解析的外部符号 "int __cdecl _AfxInitManaged(void)"。。。。。这个问题说明stdafx.cpp文件的 链接时出现问题,这个问题中的函数都是stdafx中的,而stdafx文件只用来创建预编译头,而不是使用,所以
解决办法是单独对
stdafx.cpp
文件设置创建预编译头属性,具体步骤见
第三步。
第三步:在工程中单独找到stdafx.cpp,【右键】->【属性】->
【C/C++】-> 【预编译头】->【预编译头】:创建(/Yc),然后【重新编译整个工程】,这时你会发现这个坑爹的问题终于被解决了。
---------------------------------------------
思考:上面的尝试过程其实就是每个文件对于预编译命令的不同处理造成的,而VS也可以针对不同的文件设置预编译命令,虽然我们不可能真的分别对每一个文件设置,但是,一般来说,只有工程中的stdafx.h/.cpp文件才需要创建预编译头,而其他的所有文件都是使用预编译头,所以再次遇到此问题,只需要确保两点:①整个工程的属性中设置C++预编译头为使用(/Yu)。②单独选择stdafx.cpp文件,属性,设置C++预编译头为创建(/Yc)。然后对整个工程重新编译,这些问题都解决了。