【发布时间】:2018-04-30 11:55:57
【问题描述】:
我正在使用 GNU Make(版本 3.80)构建一个 C++ 项目。 makefile 是从我正在使用的工具(IBM Rational Rhapsody)自动生成的。此 makefile 的示例在本文末尾。
这个makefile 有一个机制,允许我为目标文件(OBJ_DIR 变量)指定一个目录。如果设置了此项,则使用命令if not exist $(OBJ_DIR) mkdir $(OBJ_DIR) 设置变量CREATE_OBJ_DIR。然后为项目中的每个目标文件调用它。
运行这个makefile没有设置一个目标文件目录按预期工作;代码编译没有问题。但是在 OBJ_DIR 设置为 'build' 的情况下运行它会导致以下错误:
C:\Users\XXX\AppData\Local\Temp\make52963.sh: C:\Users\XXX\AppData\Local\Temp\make52963.sh: line 2: syntax error: unexpected end of file
C:\Tools\XXX\x86-win32\bin\make.exe: *** [build/Example.o] Error 2
当调用$(CREATE_OBJ_DIR) 时,我确定问题在“/build/Example.o”的规则范围内。如果我手动编辑规则并将$(CREATE_OBJ_DIR) 替换为mkdir $(OBJ_DIR),则该命令将正确执行。如果我然后直接将其替换为if not exist build mkdir build,以消除由于变量扩展引起的任何问题,则会出现相同的错误。
我尝试过的其他事情:
- 运行
cmdshell,并设置与调用makefile 时相同的环境变量,并尝试运行if not exist build mkdir build命令。这没有问题。 - 确保在 makefile 中运行的命令中没有尾随字符。似乎没有。
在这一点上我唯一的结论是关于 if 语句的某些内容会导致 makefile 失败,但我不确定是什么。还有什么我应该尝试追查这个问题的根源吗?我是否遗漏了一些明显的东西。
如果需要更多详细信息,请告诉我。
注意:我已经对这个 makefile 进行了大量编辑,所以它只是为了说明我正在使用什么,并且可能不会执行。下面的一些环境变量是在调用make 之前在批处理文件中设置的,但我相信它们不是我所看到的问题的一部分,因为除了上述情况之外,makefile 可以正常工作。
CPU = XXX
TOOL = gnu
INCLUDE_QUALIFIER=-I
LIB_CMD=$(AR)
LINK_CMD=$(LD)
CPP_EXT=.cpp
H_EXT=.h
OBJ_EXT=.o
EXE_EXT=.out
LIB_EXT=.a
TARGET_NAME=Example
all : $(TARGET_NAME)$(EXE_EXT) Example.mak
TARGET_MAIN=Example
LIBS=
INCLUDE_PATH=
ADDITIONAL_OBJS=
OBJS= \
build/Example.o \
OBJ_DIR=build
ifeq ($(OBJ_DIR),)
CREATE_OBJ_DIR=
else
CREATE_OBJ_DIR= if not exist $(OBJ_DIR) mkdir $(OBJ_DIR)
endif
build/Example.o : src/Example.cpp
@echo Compiling src/Example.cpp
$(CREATE_OBJ_DIR)
@$(CXX) $(C++FLAGS) -o build/Example.o src/Example.cpp
【问题讨论】:
-
只是一个简单的问题:您是否使用制表符缩进?
-
@MortenJensen 是的,构建规则使用制表符缩进。
-
你的文字很长,但在任何地方都没有任何冒犯
make52963.sh的痕迹。了解它是如何创建的以及它包含什么... -
我怀疑您的 GNU make 版本(3.8 不是有效的 GNU make 发行号;也许您使用的是 3.80?)正在调用 POSIX shell,而不是 command.com。如果这是真的,那么声明
if not exist $(OBJ_DIR) mkdir $(OBJ_DIR)是无效的。 -
@FelixPalmen 这是一个公平的观点。这必须在我每次运行
make时生成,但每次都有不同的数字。我在我的 Temp 文件夹中看不到它(在构建过程中它甚至不会暂时出现)。不知道如何找到这个。