windows下编写makefile文件的一个疑问
我理解windows下makefile文件集成了windows的批处理命令。我编写了一个windows下makefile文件,具体内容如下:
其中在执行命令:nmake /f makefile.vc option=5,但是出错:fatal error U1034: 语法错误: 缺少分隔符,如下图:

可以看出这是在78行 if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32不存在 这句出错了。
然后我写了一个简单的批处理文件来验证:
这个批处理文件却是能够正确运行的。现在我搞不懂makefile文件错在哪里了。
!include <C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\Win32.Mak>
#设置编译标记,初始化为FALSE
CFGSET = FALSE
RUN_CLEAN = FALSE
!IF "$(option)"== "1"
CFGSET = TRUE
Configuration = Release
Platform = x64
#定义release版本的预处理器
CC_OPTION = -D_WIN64 -D_NDEBUG -D_WINDOWS
TARGET_MACHINE = X64
!ELSE IF "$(option)"== "2"
CFGSET = TRUE
Configuration = Debug
Platform = x64
#定义debug版本的预处理器
CC_OPTION = -D_WIN64 -D_DEBUG -D_WINDOWS
TARGET_MACHINE = X64
!ELSE IF "$(option)"== "3"
CFGSET = TRUE
Configuration = Release
Platform = Win32
CC_OPTION = -D_WIN32 -D_NDEBUG -D_WINDOWS
TARGET_MACHINE = X86
!ELSE IF "$(option)"== "4"
CFGSET = TRUE
Configuration = Debug
Platform = Win32
CC_OPTION = -D_WIN32 -D_DEBUG -D_WINDOWS
TARGET_MACHINE = X86
!ELSE IF "$(option)"== "5"
CFGSET = TRUE
RUN_CLEAN = TRUE
!ENDIF
CC = $(CC_OPTION)
# 提示用法
#
!IF "$(CFGSET)"== "FALSE"
!MESSAGE Usage: nmake /f makefile.vc option=1 or 2 or 3 or 4 or 5
!MESSAGE
!MESSAGE where <config> is one of:
!MESSAGE - option=1 - build x64 release version
!MESSAGE - option=2 - build x64 debug version
!MESSAGE - option=3 - build x86 release version
!MESSAGE - option=4 - build x86 debug version
!MESSAGE - option=5 - clear output file
!MESSAGE
!MESSAGE
!ERROR please choose a valid configuration instead"
!ENDIF
!IF "$(RUN_CLEAN)"== "TRUE"
if exist "../../Intdir/Debug_x64/TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64不存在
if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32不存在
!ELSE
OUTDIR =..\..\OutDir\$(Configuration)_$(Platform)
INDIR =..\..\Intdir\$(Configuration)_$(Platform)\TestLog
#这里设置输出
all: $(INDIR) $(OUTDIR) $(OUTDIR)\TestLog.exe
#假如不存在$(INDIR)文件夹,就创建它
$(INDIR) :
if not exist "$(INDIR)" mkdir $(INDIR)
#假如不存在$(OUTDIR)文件夹,就创建它
$(OUTDIR) :
if not exist "$(OUTDIR)" mkdir $(OUTDIR)
# compile
$(INDIR)\FileAPI.obj:..\TestFileAPI\FileAPI.cpp
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" ..\TestFileAPI\FileAPI.cpp
$(INDIR)\GetSysError.obj: GetSysError.cpp
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" GetSysError.cpp
$(INDIR)\StringAPI.obj: StringAPI.cpp
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" StringAPI.cpp
$(INDIR)\SysLog.obj: SysLog.cpp
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" SysLog.cpp
$(INDIR)\TestLog.obj: TestLog.cpp FileAPI.obj GetSysError.obj StringAPI.obj SysLog.obj
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" TestLog.cpp
# link
$(OUTDIR)\TestLog.exe: $(INDIR)\TestLog.obj
link /machine:$(TARGET_MACHINE) /INCREMENTAL:YES /NOLOGO /subsystem:CONSOLE /out:$(OUTDIR)\TestLog.exe $(INDIR)\TestLog.obj $(INDIR)\FileAPI.obj $(INDIR)\GetSysError.obj $(INDIR)\StringAPI.obj $(INDIR)\SysLog.obj kernel32.lib user32.lib
!ENDIF
其中在执行命令:nmake /f makefile.vc option=5,但是出错:fatal error U1034: 语法错误: 缺少分隔符,如下图:

可以看出这是在78行 if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32不存在 这句出错了。
然后我写了一个简单的批处理文件来验证:
@echo off
if exist "../../Intdir/Debug_x64/TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64不存在
if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32不存在
这个批处理文件却是能够正确运行的。现在我搞不懂makefile文件错在哪里了。
...全文
相关推荐
Windows 下的 Makefile 编写(一)Makefile的基本规则
### Windows 下的 Makefile 编写(一)Makefile 的基本规则#### 一、Makefile 概述Makefile 是一种广泛应用于软件构建过程中的自动化脚本文件,主要用于描述项目构建过程中的依赖关系和构建步骤
source文件和makefile文件编写
本文档主要介绍了source文件和makefile文件在驱动开发中的关键作用和编写规则。首先,makefile文件是Make工具的核心配置文件,没有扩展名,通常命名为`makefile`。在Windo
如何编写Linux Makefile文件
**Makefile的嵌套调用**:可以在Makefile中调用另一个Makefile,用于处理项目中的子模块,使构建过程更加模块化。5.
Windows 下的 Makefile 编写(三)推理规则
### Windows 下的 Makefile 编写(三):推理规则详解#### 引言在Windows环境下编写Makefile,推理规则是实现自动化构建的核心技术之一。
如何快速高效的编写Makefile文件
一个基本的Makefile通常包含以下几个部分:1. **目标(Target)**:目标通常是可执行文件或者目标文件。


