我编写了一下makefile,文件名就为MAKEFILE
当我执行NMAKE的时候,每次都是只把MkTester1.cpp(即第一个源文件)变异完后就结束了,后面的CPP文件始终不能被编译,各位请看我的MAKEFILE是不是有问题啊?
虽然所有的!MESSAGE后面的信息都能输出,但是只生成了MkTester1.obj一个文件!!INCLUDEFILE_PATH = D:\Progra~1\Micros~1\VC98\Include
LIBFILE_PATH = D:\Progra~1\Micros~1\VC98\Lib
CPP_FLAG = /c /MTd /Zi /Od /D_DEBUG /DWIN32!MESSAGE Create MkTester1.obj
MkTester1.obj: MkTester1.cpp
cl $(CPP_FLAG) /I$(INCLUDEFILE_PATH) MkTester1.cpp
# 每次只能编译到这个地方
!MESSAGE Create myapi.obj
myapi.obj : myapi.cpp myapi.h
cl $(CPP_FLAG) /I$(INCLUDEFILE_PATH) myapi.cpp!MESSage Create the executable file MkTester1.exe
LIBS = $(LIBFILE_PATH)\LIBCMTD.lib \
$(LIBFILE_PATH)\OLDNAMES.lib \
$(LIBFILE_PATH)\KERNEL32.LIBMkTester1.exe : MkTester1.obj myapi.obj
link MkTester1.obj myapi.obj $(LIBS)
当我执行NMAKE的时候,每次都是只把MkTester1.cpp(即第一个源文件)变异完后就结束了,后面的CPP文件始终不能被编译,各位请看我的MAKEFILE是不是有问题啊?
虽然所有的!MESSAGE后面的信息都能输出,但是只生成了MkTester1.obj一个文件!!INCLUDEFILE_PATH = D:\Progra~1\Micros~1\VC98\Include
LIBFILE_PATH = D:\Progra~1\Micros~1\VC98\Lib
CPP_FLAG = /c /MTd /Zi /Od /D_DEBUG /DWIN32!MESSAGE Create MkTester1.obj
MkTester1.obj: MkTester1.cpp
cl $(CPP_FLAG) /I$(INCLUDEFILE_PATH) MkTester1.cpp
# 每次只能编译到这个地方
!MESSAGE Create myapi.obj
myapi.obj : myapi.cpp myapi.h
cl $(CPP_FLAG) /I$(INCLUDEFILE_PATH) myapi.cpp!MESSage Create the executable file MkTester1.exe
LIBS = $(LIBFILE_PATH)\LIBCMTD.lib \
$(LIBFILE_PATH)\OLDNAMES.lib \
$(LIBFILE_PATH)\KERNEL32.LIBMkTester1.exe : MkTester1.obj myapi.obj
link MkTester1.obj myapi.obj $(LIBS)
cl $(CPP_FLAG) /I$(INCLUDEFILE_PATH) myapi.cpp比如路径不对,有编译连接错误等如果用的vc++的话,可以打开这个工程,再打开myapi.cpp文件,用Ctrl+F7编译一下看生成obj没
因为自己写makefile文件要灵活的多!
这个makefile文件中没有链接错误!
当把
MkTester1.obj: MkTester1.cpp
cl $(CPP_FLAG) /I$(INCLUDEFILE_PATH) MkTester1.cpp
给注释掉以后,就可以生成myapi.obj了!但是这样的话link又不执行了!
好像是每次只能执行一次cl命令!这是为什么啊?
还是nmake需要指定特定的参数才能执行makefile中的所有cl命令?
还有和你的src文件和makefile文件方的地方有关系.
就可以编译,但是为什么我单独编译每个文件就不行呢?
LIBFILE_PATH = D:\Progra~1\Micros~1\VC98\Lib
CPP_FLAG = /c /MTd /Zi /Od /D_DEBUG /DWIN32#需要在这里添加一个
OBJS = MkTester1.obj myapi.obj
all: MkTester1.exe
如:
LIBS = $(LIBFILE_PATH)\LIBCMTD.lib $(LIBFILE_PATH)\OLDNAMES.lib $(LIBFILE_PATH)\KERNEL32.LIB
想要写成
LIBS = LIBCMTD.LIB OLDNAMES.LIB KERNEL32.LIB
的话需要怎样设置环境或加什么参数才能使CL找到这些库文件?就像CL指定 /I参数就可以指定头文件的位置一样!
其实只要在MAKEFILE的开头指定需要进行哪些编译或链接操作即可
即:
MYOUTPUT : MkTester1.obj myapi.obj MkTester1.EXE MkTester2
然后再给MYOUTPUT指定的所有项指定编译或链接操作即可:MkTester1.obj :....
CL ...
myapi.obj : ...
CL ...MkTester1.EXE
LINK ... /OUT:MkTester1.exe
MkTester2
LINK ... /OUT:MkTester2.exe总算搞清楚了!:)
= 用于定义宏
:用于指定targets和dependencis只见的关系!