我正在为使用C ++进行的项目编写makefile。我有一个名为tests的目录,其中包含用于单元测试的代码,其中包括使用cxxtest的文件。

生成文件为:

CC=clang++
CFLAGS=-c -Wall -std=c++11
LDFLAGS= -lsfml-graphics -lsfml-system -lsfml-window
SOURCES=memtest.cpp guitest.cpp
CXXTEST=LTest.h
CXXCPP=$(CXXTEST:.h=.cpp)
CXXOBJ=$(CXXTEST:.h=.o)
CXXBIN=$(CXXTEST:.h=.bin)
MAX_PARALLEL=6
OBJECTS=$(SOURCES:.cpp=.o)
BINS=$(SOURCES:.cpp=.b)

all: $(CXXBIN)

run: all


$(CXXCPP): $(subst .cpp,.h,$@)
cxxtestgen --error-printer -o $@ $(subst .cpp,.h,$@)


$(CXXOBJ): $(subst .o,.cpp,$@)
$(CC) $(CFLAGS) -o $@ $(subst .o,.cpp,$@)

$(CXXBIN): $(subst .bin,.o,$@)
$(CC) $(subst .bin,.o,$@) $(OBJECTS) -o $@


$(OBJECTS): $(subst .o,.cpp,$@)
$(CC) $(CFLAGS) $(subst .o,.cpp,$@) -o $@

$(BINS): $(subst .b,.o,$@)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
clean:
rm -f LTest.cpp LTest LTest.o guitest guitest.o


但是,当我运行LTest.h存在的make LTest时,make正在尝试运行

  clang++ -c -Wall -std=c++11 -o LTest.o LTest.cpp


无需先创建LTest.cpp。

显然,$(subst .o,.cpp,$@)扩展为LTest.cpp,所以为什么不起作用?

最佳答案

$@这样的自动变量仅在配方中有意义:make在完全解析依赖项行后对其进行计算。在解释依赖项时,$@设置为空。您必须明确说明:

$(CXXCPP): $(CXXTEST)
    cxxtestgen ... (this line may use $@, $^, etc)

关于c++ - Makefile的注册顺序不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34665136/

10-11 17:59