今天在VC2005中修改一个工程的文件结构c;将"stdafx.cpp"文件挪动了位置c;编译时出现C2859错误c;具体信息如下:
error C2859: e:/projects/apptest/src/debug/color:rgb(255,0,0); font-size:16px">vc80.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header. e:/projects/apptest/src/mainapp.cpp 4
error C2859: e:/projects/apptest/src/debug/color:rgb(255,0,0); font-size:16px">vc80.idb is not the idb file that was used when this precompiled header was created, recreate the precompiled header. e:/projects/apptest/src/mainapp.cpp 4
(这个应该是Make的规则在起作用)按照提示要求c;clean编译文件c;rebuild工程c;还是一样的问题。发现debug文件夹下总是有一个mainapp.pch文件(预编译文件)c;即使clean也不会删除。将该文件手动删除c;rebuild工程c;出现C1083错误:
fatal error C1083: Cannot open precompiled header file: 'Debug/color:rgb(255,0,0); font-size:16px">MainApp.pch': No such file or directory e:/projects/apptest/src/mainapp.cpp 4
查看工程设置properties -> Configuration Properties -> C/C++ -> Precompiled Headersc;为“Use Precompiled Headers (/Yu)”c;所以预编译文件mainapp.pch不会自动生成;改为“Create Precompiled Headers (/Yc)”c;rebuild工程c;ok。
但是工程原来的设置“Use Precompiled Headers (/Yu)”是可以编译成功的啊c;于是再改回原来的设置c;buildc;出现LNK2001错误:
error LNK2001: unresolved external symbol "int __cdecl color:rgb(255,0,0); font-size:16px">_AfxInitManaged(void)" (?_AfxInitManaged@@YAHXZ) mfcs80ud.lib
百思不得其解c;google上找答案c;原来VC对于预编译的设置是这样的:
color:rgb(255,1,2); font-weight:bold; text-decoration:underline"> 1、"stdafx.cpp"文件的预编译选项永远是“Create Precompiled Headers (/Yc)”;
color:rgb(255,1,2); font-weight:bold; text-decoration:underline"> 2、工程的预编译选项一般为“Use Precompiled Headers (/Yu)”。
可知"color:rgb(255,1,2)">stdafx.cpp"文件的预编译选项一般与工程的预编译选项设置是不同的c;也就是说coration:underline">每次build工程时c;"stdafx.cpp"文件都要生成预编译文件*.pchc;而其他cpp文件则直接用这个文件进行编译。于是选中"stdafx.cpp"文件c;右键“Properties”c;选择 “All Configurations”c;将预编译选项设置为“Create Precompiled Headers (/Yc)”c;再次rebuildc;一切ok。
回忆引起出错的操作c;是从工程中删除"stdafx.cpp"文件后又添加到工程中的。看来color:rgb(255,1,2)">VC框架生成的工程会自动将"stdafx.cpp"文件的预编译选项设置好c;如果用户手动添加该文件的话c;预编译选项将会与工程的选项相同。打开一个以前的MFC工程查看c;果然验证了自己的想法。