makefile 中未遵循依赖关系

问题描述 投票:0回答:1

我有以下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:
完成,则可能会发生这种情况..

c++ makefile
1个回答
0
投票

您的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 $@
© www.soinside.com 2019 - 2024. All rights reserved.