C &引用;将目标定为“;“之后不工作”;“保持清洁”;

C &引用;将目标定为“;“之后不工作”;“保持清洁”;,c,makefile,gnu-make,C,Makefile,Gnu Make,我正在尝试为一个小C程序编写一个Makefile。它的结构是 根项目 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/hel

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

根项目

  • 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
它应该构建此测试所需的任何内容。然后运行测试/hello\u make\u测试

我让大多数Makefile工作。它将源文件构建并编译为.o 将这些链接到测试程序。 $\

我的问题是,只有在我先使用全部生成,然后再使用生成测试时,这才有效。 当我进行清洁之后进行测试时。我得到以下错误

cc调用似乎与作为源的对象文件不符?我是新来的,现在是 我想不通。请帮忙

这条线

compile_tests: CFLAGS += $(OBJECTS)
将所有对象添加到CFLAGS变量,该变量将在编译时由隐式规则(内置于make中)使用

在makefile中,尽量将源代码、编译器标志和生成的对象文件分开,以避免这种混淆

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

这一行

compile_tests: CFLAGS += $(OBJECTS)
将所有对象添加到CFLAGS变量,该变量将在编译时由隐式规则(内置于make中)使用

在makefile中,尽量将源代码、编译器标志和生成的对象文件分开,以避免这种混淆


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

谢谢。我之所以添加这一行,是因为它没有将src文件与测试文件链接…@mathguy80不客气。这是否解决了您的问题,或者您的问题中是否有更多信息需要补充?是的,谢谢。制作手册写得很好。最后,我为$(TESTS)编写了一个隐式规则,该规则执行$(CC)$(OBJECTS)$@.c-o$@@mathguy80是的,通过多次阅读它可以获得很多东西,只是为了感受添加的所有功能。当你的项目发展壮大时,你会感谢你以前的自己有效地使用了聪明的部分。谢谢。我之所以添加这一行,是因为它没有将src文件与测试文件链接…@mathguy80不客气。这是否解决了您的问题,或者您的问题中是否有更多信息需要补充?是的,谢谢。制作手册写得很好。最后,我为$(TESTS)编写了一个隐式规则,该规则执行$(CC)$(OBJECTS)$@.c-o$@@mathguy80是的,通过多次阅读它可以获得很多东西,只是为了感受添加的所有功能。当你的项目发展壮大时,你会感谢你以前的自己有效地利用了聪明的部分。