用nmake编译的问题: don't know how to make "*.pch"

hxblvc 2006-10-25 11:54:06

大家好!

我们项目中的工程比较多, 所以我用make文件来进行编译.

但是代码编译成功后, 在另一个机子上从CVS导出来后,再用nmake 进行编译,就会出现这个错误:

fatal error U1073: don't know how to make '".\Debug\*.pch

可是在vc6的工作区中编译就没事!

是什么原因? 请大家帮忙.

谢谢先了.
...全文
280 点赞 收藏 9
写回复
9 条回复
hxblvc 2006年11月03日
to:aspnetwuxueyou
谢谢,明白了.

结贴了.

谢谢大家. 我又在网上找了一个.pch文件的详细说明:

预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码.

为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间.但它们又不常被修改,是较稳定的,为单独的一个小文件而重新编译整个工程的所有文件导致编译效率下降,因此引入了.PCH文件.

如何使用预编译头文件以提高编译速度?要使用预编译头文件,必须指定一个头文件(.H),它包含我们不会经常修改的代码和其他的头文件,然后用这个头文件(.H)来生成一个预编译头文件(.PCH)VC默认的头文件就是StdAfx.h,因为头文件是不能编译的,所以我们还需要一个.CPP文件来作桥梁,VC默认的文件为StdAfx.cpp,这个文件里只有一句代码就是:#include "StdAfx.h".接下来要用它生成.PCH文件,涉及到几个重要的预编译指令:/Yu,/Yc,/Yx,/Fp.简单地说,/Yc是用来生成.PCH文件的编译开关.在Project->setting->C/C++的Category里的Precompiled Header,然后在左边的树形视图中选择用来编译生成.PCH文件的.CPP文件(默认即StdAfx.cpp)你就可以看到/Yc这个开关,它表示这个文件编译了以后是否生成.PCH文件(可能/Yc的c表示create)./Fp指令指定生成的.PCH文件的名字及路径(可能/Fp的p代表path)./Yu的u即use使用,工程中只要包括了.H文件的文件都会有这个/Yu指令.如果选择自动Automatic...的话则原来为/Yc的地方就换成了/Yx指令.如果选择自动,则每次编译时编译器会看以前有没有生成过.PCH文件,有则不现生成否则就再次编译产生.PCH文件.

注意:
A,实际上,由Appzard项目向导生成的默认的头文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的.原因很简单.但如果你要这样做就要记得修改相应的Project->setting...下的几个预编译指令(/Yc,/Yu,/Yx,/Fp)的参数.
B.在任何一个包括了将要预编译的头文件而使用了.PCH文件的工程文件的开头,一定必须要是在最开头,你要包含那个指定生成.PCH文件的.H文件(通过.CPP文件包括,默认为StdAfx.cpp),如果没包括将产生我最开头产生的错误.如果不是在最开头包括将产生让你意想不到的莫名其妙错误,如若不信,盍为试之?
C.预编译文件.PCH生成之很耗时间,而且生成之后它也很占磁盘空间,常在5-6M,注意项目完成之后及时清理无用的.PCH文件以节约磁盘空间.
D.如果丢了或删了.PCH文件而以后要再修改工程文件时,可将指定的/Yc的.CPP文件(默认为StdAfx.cpp)重新编译一次即可再次生成.PCH文件,不用傻傻的按F7或Rebuild All

回复 点赞
aspnetwuxueyou 2006年10月26日
看看你的makefile中
CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\syx_console_gui.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
里面只有/Yu,哪来的/Yc呀
回复 点赞
aspnetwuxueyou 2006年10月26日
写错了
应该是
SOURCE=.\stdafx.cpp

CPP_SWITCHES = ............./Fp "$(INTDIR)\*.pch" /Yc"stdafx.h"
"$(INTDIR)\stdafx.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) @<<$(CPP_SWITCHs) $(SOURCE)

看到/Yc了吗?这个是创建.pch
只有stdafx.cpp对应/Yc,而其他的cpp对应用/Yu,就是说stdafx.cpp用来创建.pch,而其他的cpp使用.pch
回复 点赞
aspnetwuxueyou 2006年10月26日
SOURCE=.\stdafx.cpp

CPP_SWITCHES = ............./Fp "$(INTDIR)\*.pch" /Yu"stdafx.h"
"$(INTDIR)\stdafx.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) @<<$(CPP_SWITCHs) $(SOURCE)
回复 点赞
neosu 2006年10月26日



Rebuild All

回复 点赞
aspnetwuxueyou 2006年10月26日
你的makefile中确实没有地方创建.pch的语句呀
回复 点赞
hxblvc 2006年10月25日
谢谢. 下边是syx_console_gui.mak文件:

===============================================================================
# Microsoft Developer Studio Generated NMAKE File, Based on syx_console_gui.dsp
!IF "$(CFG)" == ""
CFG=syx_console_gui - Win32 Debug
!MESSAGE No configuration specified. Defaulting to syx_console_gui - Win32 Debug.
!ENDIF

!IF "$(CFG)" != "syx_console_gui - Win32 Release" && "$(CFG)" != "syx_console_gui - Win32 Debug"
!MESSAGE Invalid configuration "$(CFG)" specified.
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "syx_console_gui.mak" CFG="syx_console_gui - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "syx_console_gui - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "syx_console_gui - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
!ERROR An invalid configuration is specified.
!ENDIF

!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE
NULL=nul
!ENDIF

!IF "$(CFG)" == "syx_console_gui - Win32 Release"

OUTDIR=.\Release
INTDIR=.\Release
# Begin Custom Macros
OutDir=.\Release
# End Custom Macros

ALL : "$(OUTDIR)\syx_console_gui.dll"


CLEAN :
-@erase "$(INTDIR)\rebar_manage_impl.obj"
-@erase "$(INTDIR)\stdafx.obj"
-@erase "$(INTDIR)\syx_console_gui.obj"
-@erase "$(INTDIR)\tbitem_manage_impl.obj"
-@erase "$(INTDIR)\toolbar_manage_impl.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(OUTDIR)\syx_console_gui.dll"
-@erase "$(OUTDIR)\syx_console_gui.exp"
-@erase "$(OUTDIR)\syx_console_gui.lib"

"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

CPP=cl.exe
CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\syx_console_gui.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c

.c{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cpp{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cxx{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.c{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cpp{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cxx{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<

MTL=midl.exe
MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
RSC=rc.exe
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\syx_console_gui.bsc"
BSC32_SBRS= \

LINK32=link.exe
LINK32_FLAGS=/nologo /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\syx_console_gui.pdb" /machine:I386 /out:"$(OUTDIR)\syx_console_gui.dll" /implib:"$(OUTDIR)\syx_console_gui.lib"
LINK32_OBJS= \
"$(INTDIR)\rebar_manage_impl.obj" \
"$(INTDIR)\stdafx.obj" \
"$(INTDIR)\syx_console_gui.obj" \
"$(INTDIR)\tbitem_manage_impl.obj" \
"$(INTDIR)\toolbar_manage_impl.obj"

"$(OUTDIR)\syx_console_gui.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<

!ELSEIF "$(CFG)" == "syx_console_gui - Win32 Debug"

OUTDIR=.\../../../../bin/debug
INTDIR=.\Debug
# Begin Custom Macros
OutDir=.\../../../../bin/debug
# End Custom Macros

ALL : "$(OUTDIR)\syx_console_gui.dll"


CLEAN :
-@erase "$(INTDIR)\rebar_manage_impl.obj"
-@erase "$(INTDIR)\stdafx.obj"
-@erase "$(INTDIR)\syx_console_gui.obj"
-@erase "$(INTDIR)\tbitem_manage_impl.obj"
-@erase "$(INTDIR)\toolbar_manage_impl.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(INTDIR)\vc60.pdb"
-@erase "$(OUTDIR)\syx_console_gui.dll"
-@erase "$(OUTDIR)\syx_console_gui.exp"
-@erase "$(OUTDIR)\syx_console_gui.ilk"
-@erase "$(OUTDIR)\syx_console_gui.lib"
-@erase "$(OUTDIR)\syx_console_gui.pdb"

"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

"$(INTDIR)" :
if not exist "$(INTDIR)/$(NULL)" mkdir "$(INTDIR)"

CPP=cl.exe
CPP_PROJ=/nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\syx_console_gui.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c

.c{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cpp{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cxx{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.c{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cpp{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<

.cxx{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<

MTL=midl.exe
MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
RSC=rc.exe
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\syx_console_gui.bsc"
BSC32_SBRS= \

LINK32=link.exe
LINK32_FLAGS=global_env.lib script.lib module.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"$(OUTDIR)\syx_console_gui.pdb" /debug /machine:I386 /out:"$(OUTDIR)\syx_console_gui.dll" /implib:"$(OUTDIR)\syx_console_gui.lib" /pdbtype:sept /libpath:"../../../../bin/debug"
LINK32_OBJS= \
"$(INTDIR)\rebar_manage_impl.obj" \
"$(INTDIR)\stdafx.obj" \
"$(INTDIR)\syx_console_gui.obj" \
"$(INTDIR)\tbitem_manage_impl.obj" \
"$(INTDIR)\toolbar_manage_impl.obj"

"$(OUTDIR)\syx_console_gui.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<

!ENDIF


!IF "$(NO_EXTERNAL_DEPS)" != "1"
!IF EXISTS("syx_console_gui.dep")
!INCLUDE "syx_console_gui.dep"
!ELSE
!MESSAGE Warning: cannot find "syx_console_gui.dep"
!ENDIF
!ENDIF


!IF "$(CFG)" == "syx_console_gui - Win32 Release" || "$(CFG)" == "syx_console_gui - Win32 Debug"
SOURCE=.\rebar_manage\rebar_manage_impl.cpp

"$(INTDIR)\rebar_manage_impl.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\syx_console_gui.pch"
$(CPP) $(CPP_PROJ) $(SOURCE)


SOURCE=.\stdafx.cpp

"$(INTDIR)\stdafx.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\syx_console_gui.pch"


SOURCE=.\syx_console_gui.cpp

"$(INTDIR)\syx_console_gui.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\syx_console_gui.pch"


SOURCE=.\tbitem_manage\tbitem_manage_impl.cpp

"$(INTDIR)\tbitem_manage_impl.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\syx_console_gui.pch"
$(CPP) $(CPP_PROJ) $(SOURCE)


SOURCE=.\toolbar_manage\toolbar_manage_impl.cpp

"$(INTDIR)\toolbar_manage_impl.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\syx_console_gui.pch"
$(CPP) $(CPP_PROJ) $(SOURCE)



!ENDIF

回复 点赞
DentistryDoctor 2006年10月25日
是呀,你makefile是怎么写的?
回复 点赞
aspnetwuxueyou 2006年10月25日
把makefile贴出来看看
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7898

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告