在makefile中添加源文件和更新依赖项

时间:2017-08-23 13:46:39

标签: c++ makefile

我正在用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

1 个答案:

答案 0 :(得分:2)

您不能在先决条件列表中使用特定于目标的变量值。关于这个问题,GNU make手册是very clear

  

另一个例外是特定于目标的变量值。此功能允许您根据当前构建的目标为同一变量定义不同的值。 与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)。

(重点补充)。您可以专门添加测试目标:

$(TESTTARGET): $(OBJECT_FILES) tests/tests.o
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LDLIBS)
        ./dsptest

PS。我不建议使用$(subst ...)替换扩展名;请改用$(patsubst ...)