我正在尝试为小型C程序编写Makefile。它的结构是
project_root
我的make文件在下面。
CFLAGS = -g -Wall -Isrc $(OPTFLAGS)
LDLIBS = $(OPTLIBS)
PREFIX ?= /usr/local/
OPTVALGRIND="valgrind --track-origins=yes --log-file=tests/valgrind.log"
TARGET_SRC = src/hello_make.c
TARGET = build/hello_make
SOURCES := $(wildcard src/*.c)
SOURCES := $(filter-out $(TARGET_SRC),$(SOURCES))
OBJECTS = $(patsubst %.c,%.o,$(SOURCES))
TEST_SRC = $(wildcard tests/*_tests.c)
TESTS = $(patsubst %.c,%,$(TEST_SRC))
TEST_FILE ?= hello_make_tests
all: $(TARGET) tests
$(TARGET): build $(OBJECTS)
$(CC) $(CFLAGS) $(TARGET_SRC) $(OBJECTS) $(LDLIBS) -o $@
.PHONY: compile_tests tests test testv valgrind build clean
compile_tests: LDLIBS += -lrt -lm
compile_tests: CFLAGS += $(OBJECTS)
compile_tests: build $(OBJECTS) $(TESTS)
@echo "TARGET=$(TARGET), TESTS=$(TESTS)"
@echo "compile_tests done"
tests: compile_tests
sh ./tests/run_tests.sh
test: compile_tests
sh ./tests/run_test.sh tests/$(TEST_FILE)
testv: compile_tests
sh ./tests/run_test.sh tests/$(TEST_FILE)
valgrind:
VALGRIND=$(OPTVALGRIND) $(MAKE) -s
clean:
rm -rf $(OBJECTS)
rm -rf $(TARGET)
rm -rf $(TESTS)
rm -rf build
rm -rf tests/*.log
build:
@mkdir -p build
我有一个目标测试和testv(对应于使用valgrind运行)。 所以,当我这样做时,
make test TEST_FILE=hello_make_tests
它应该构建此测试所需的任何内容。然后运行tests / hello_make_tests。
我的大部分Makefile都在工作。它构建并编译源文件到.o 将它们链接到测试程序。 $ \
我的问题是,只有先使用 make all 然后再使用 make test ,才能使用此功能。 当我 make clean 然后 make test 。我收到以下错误。
cc -g -Wall -Isrc src/get_one.o src/get_three.o src/get_two.o -c -o src/get_one.o src/get_one.c
cc: error: src/get_one.o: No such file or directory
cc: error: src/get_three.o: No such file or directory
cc: error: src/get_two.o: No such file or directory
make: *** [src/get_one.o] Error 1
cc调用似乎是作为源的目标文件的错误?我很擅长制作 无法弄清楚这一点。请帮忙。
答案 0 :(得分:1)
这一行
compile_tests: CFLAGS += $(OBJECTS)
将所有对象添加到CFLAGS变量中,该变量将在编译时由隐式规则(内置于make中)使用。
尝试在makefile中保留源代码,编译器标志和结果对象文件,以避免这种混淆。
如果您不确定它们的用法,请快速查看makefile标志的文档。