windows下编写makefile文件的一个疑问

clever101
博客专家认证
2019-10-10 05:12:34
我理解windows下makefile文件集成了windows的批处理命令。我编写了一个windows下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文件错在哪里了。
...全文
194 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2019-10-16
  • 打赏
  • 举报
回复
写了一篇总结文章: Windows环境下的makefile编写要点 另外欢迎大家关注我的微信公众号:
赵4老师 2019-10-16
  • 打赏
  • 举报
回复
引用 9 楼 宁可十年不将军,不可一日不拱卒 的回复:
[quote=引用 8 楼 赵4老师 的回复:] MakeFile中Tab和空格不能混用这是一条常识。
大侠,是要用Tab而不能用空格吧。[/quote] 对呀!
clever101 2019-10-16
  • 打赏
  • 举报
回复
引用 8 楼 赵4老师 的回复:
MakeFile中Tab和空格不能混用这是一条常识。
大侠,是要用Tab而不能用空格吧。
赵4老师 2019-10-16
  • 打赏
  • 举报
回复
MakeFile中Tab和空格不能混用这是一条常识。
clever101 2019-10-11
  • 打赏
  • 举报
回复
只插入tab键也是不行的。需要进行如下修改:

!IF "$(RUN_CLEAN)" == "TRUE"
CLEAN:
	if exist "..\..\Intdir\Debug_x64\TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64 not exist
	if exist "..\..\Intdir\Debug_Win32\TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32 not exist
	if exist "..\..\Intdir\Release_x64\TestLog" (del "..\..\Intdir\Release_x64\TestLog\*.obj") else echo Release_x64 not exist
	if exist "..\..\Intdir\Release_Win32\TestLog" (del "..\..\Intdir\Release_Win32\TestLog\*.obj") else echo Release_Win32 not exist

!ELSE
关键点有三点: 1.必须增加一个块名,比如这里添加了CLEAN: 2.CLEAN:和if exist之间不能有空行。 3.if exist之前至少得插入一个tab。
clever101 2019-10-11
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
[quote=引用 2 楼 宁可十年不将军,不可一日不拱卒 的回复:] 改成

if exist "../../Intdir/Debug_x64/TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64 not exist
if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32 not exist
也是一样的错误:fatal error U1034: 语法错误: 缺少分隔符
试试这个方法: https://blog.csdn.net/uagvdu/article/details/79238367?utm_source=blogxgwz5 原因: 我从别的地方粘贴复制到makefile中,总是出现 遗漏分隔符 现象 解决方法: 找到对应的一行: 把前面的空白全部删除,然后输入 Tab 即可. 我已经没招了,这个也不熟。[/quote] 又重新测试了,方法确实有效。经验是删除该行前面的全部空格,然后至少插入一个tab。
clever101 2019-10-11
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
[quote=引用 2 楼 宁可十年不将军,不可一日不拱卒 的回复:] 改成

if exist "../../Intdir/Debug_x64/TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64 not exist
if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32 not exist
也是一样的错误:fatal error U1034: 语法错误: 缺少分隔符
试试这个方法: https://blog.csdn.net/uagvdu/article/details/79238367?utm_source=blogxgwz5 原因: 我从别的地方粘贴复制到makefile中,总是出现 遗漏分隔符 现象 解决方法: 找到对应的一行: 把前面的空白全部删除,然后输入 Tab 即可. 我已经没招了,这个也不熟。[/quote] 试了,没用。今天发现在 !IF "$(RUN_CLEAN)"== "TRUE" # 这里面不能放任何批处理命名,不过放!MESSAGE却是可以的,真是奇怪 !ELSE
  • 打赏
  • 举报
回复
引用 2 楼 宁可十年不将军,不可一日不拱卒 的回复:
改成

if exist "../../Intdir/Debug_x64/TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64 not exist
if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32 not exist
也是一样的错误:fatal error U1034: 语法错误: 缺少分隔符
试试这个方法: https://blog.csdn.net/uagvdu/article/details/79238367?utm_source=blogxgwz5 原因: 我从别的地方粘贴复制到makefile中,总是出现 遗漏分隔符 现象 解决方法: 找到对应的一行: 把前面的空白全部删除,然后输入 Tab 即可. 我已经没招了,这个也不熟。
赵4老师 2019-10-11
  • 打赏
  • 举报
回复
/和\最好不要混用。
clever101 2019-10-10
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
[quote=引用 楼主 宁可十年不将军,不可一日不拱卒 的回复:]

@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文件错在哪里了。
改成英文的试试。[/quote] 改成

if exist "../../Intdir/Debug_x64/TestLog" (del "..\..\Intdir\Debug_x64\TestLog\*.obj") else echo Debug_x64 not exist
if exist "../../Intdir/Debug_Win32/TestLog" (del "..\..\Intdir\Debug_Win32\TestLog\*.obj") else echo Debug_Win32 not exist
也是一样的错误:fatal error U1034: 语法错误: 缺少分隔符
  • 打赏
  • 举报
回复
引用 楼主 宁可十年不将军,不可一日不拱卒 的回复:

@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文件错在哪里了。
改成英文的试试。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧