【问题标题】:"make target" not working after "make clean"在“make clean”之后“make target”不起作用
【发布时间】:2012-10-15 13:30:11
【问题描述】:

我正在尝试为小型 C 程序编写 Makefile。它的结构是

project_root

  • src(源文件)
  • 测试(测试文件)
  • 构建(程序二进制)

我的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 将这些链接到测试程序。 $\

我的问题是,这只有在我先使用 ma​​ke all 然后再使用 ma​​ke test 时才有效。 当我执行 ma​​ke clean 之后是 ma​​ke 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 调用似乎是错误的?我很新,我是 无法弄清楚这一点。请帮忙。

【问题讨论】:

    标签: c makefile gnu-make


    【解决方案1】:

    这一行

    compile_tests: CFLAGS += $(OBJECTS)
    

    将所有对象添加到 CFLAGS 变量中,该变量将在编译时被隐式规则(内置于 make 中)使用。

    尽量在你的 makefile 中保持源文件、编译器标志和生成的目标文件分开以避免这种混淆。

    如果您不确定它们的用法,请快速查看 makefile 标志的文档。

    【讨论】:

    • 谢谢。我只添加了该行,因为它没有将 src 文件与测试文件链接...
    • @mathguy80 不客气。这是否解决了您的问题,还是有更多信息可以添加到您的问题中?
    • 是的,谢谢。 Make手册写得很好。我最终为 $(TESTS) 编写了一个隐式规则,它执行 $(CC) $(OBJECTS) $@.c -o $@.
    • @mathguy80 是的,多读几遍就能对添加的所有功能有所了解。当您的项目发展壮大时,您会感谢以前的自己有效地使用了这些聪明的部分。
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2019-01-21
    • 1970-01-01
    相关资源
    最近更新 更多