我有以下makefile
SRCS = a.cpp
OBJS = $(SRCS:.cpp=.o)
all: $(MAIN)
@echo Compiled successfully
$(MAIN): $(OBJS)
$(CXX) $(LFLAGS) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)
.cpp.o:
$(CXX) $(LFLAGS) $(CFLAGS) $(INCLUDES) -c $< -o $@
当我运行
make all
时,最初不存在 .o
文件,因此执行 .cpp.o:
规则(a.o: a.cpp),然后我看到 $(MAIN):
规则正在执行 - 然而 - 看起来像 $(MAIN):
规则在创建 a.o 目标文件之前执行,并且 make 失败并提示找不到 'a.o' 文件..
这种情况不会一直发生,这表明存在某种竞争条件,如果
$(MAIN):
规则不“等待”直到 .cpp.o:
完成,则可能会发生这种情况..
您的Makefile似乎不完整,因为您有一个变量引用
$(MAIN)
但您似乎没有为MAIN
变量设置值(并且您也没有提到从命令行给它一个值) )。按照 Makefile 的编写方式,变量 MAIN
应该具有要生成的可执行文件的名称。
你的 makefile 中应该有这样的内容:
MAIN = yourprog
(您也没有为
CXX
变量(C++ 编译器的名称)提供值,因此您依赖于 GNU Make 提供的 默认值。在学习 Make 时或者如果您只是想避免依赖对于内置默认值,您可能会发现使用 -r
和 -R
开关测试 Makefile 来禁用内置规则和变量很有用。)
您还在 Makefile 中使用旧式 后缀规则。 GNU Make 手册称它们已过时,并建议使用 模式规则 来代替:
%.o: %.cpp
$(CXX) $(LFLAGS) $(CFLAGS) $(INCLUDES) -c $< -o $@