我正在用C ++编写一个(动态)库,并为它编写了一组测试。目前,我正在使用makefile(默认目标),可以构建库或构建并运行测试(test
目标)。整个区别在于几个链接器标志以及是否包含单个.cpp
文件(包含main
),但我无法正确构建test
目标,因为依赖列表由于某种原因没有更新。
这是整个makefile:
CXX = g++
RM=rm -f
EXTRA_CCFLAGS = -Wall -Wextra -Wcast-qual -Wfloat-equal -Wpedantic -Wpointer-arith -Wshadow
CXXOPTFLAGS = -O2
CXXFLAGS = -std=c++11 $(EXTRA_CCFLAGS) $(CXXOPTFLAGS)
LDLIBS=-larmadillo
MAKELIBFLAGS=-current_version 0.1 -compatibility_version 0.1 -dynamiclib
TARGET = libadsp.dylib
TESTTARGET = dsptest
SOURCE_FILES=src/stft.cpp src/filters.cpp src/windows.cpp src/helpers.cpp
OBJECT_FILES=$(subst .cpp,.o,$(SOURCE_FILES))
all: $(TARGET)
test: SOURCE_FILES += tests/tests.cpp
test: OBJECT_FILES = $(subst .cpp,.o,$(SOURCE_FILES))
test: $(TESTTARGET)
$(TARGET): $(OBJECT_FILES)
$(CXX) $(CXXFLAGS) $(MAKELIBFLAGS) -o $(TARGET) $(OBJECT_FILES) $(LDLIBS)
$(TESTTARGET): $(OBJECT_FILES)
$(CXX) $(CXXFLAGS) -o $(TESTTARGET) $(OBJECT_FILES) $(LDLIBS)
./dsptest
depend: .depend
.depend: $(SOURCE_FILES)
$(RM) ./.depend
$(CXX) $(CXXFLAGS) -MM $^>>./.depend;
.PHONY: clean
clean:
$(RM) $(OBJECT_FILES)
$(RM) ./.depend
include .depend
答案 0 :(得分:2)
您不能在先决条件列表中使用特定于目标的变量值。关于这个问题,GNU make手册是very clear:
另一个例外是特定于目标的变量值。此功能允许您根据当前构建的目标为同一变量定义不同的值。 与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)。
(重点补充)。您可以专门添加测试目标:
$(TESTTARGET): $(OBJECT_FILES) tests/tests.o
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDLIBS)
./dsptest
PS。我不建议使用$(subst ...)
替换扩展名;请改用$(patsubst ...)
。