Makefile,如何将OBJ文件放在单独的目录中?

时间:2018-08-12 17:13:00

标签: makefile gnu-make

当前,我的项目的所有文件都在一个目录中。我正在尝试对其进行重组,以便为​​ .c文件提供一个src目录,为* .h文件提供一个include目录,并为* .o文件提供一个obj目录。 src的子目录。我的makefile和一个目录中的每个文件都可以正常工作,看起来像这样:

CC=gcc
CFLAGS=-I. -Wall -Wextra -Wpedantic -Werror
DEPS = Triangle.h
OBJ = Trianglecalc.o Triangle.o
TESTOBJ = area_of_triangle_test.o verify_triangle_test.o validate_input_test.o get_side_length_test.o Triangle.o
LIBS=-lm

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

Trianglecalc: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

tests: $(TESTOBJ)
    $(CC) -o area_of_triangle_test area_of_triangle_test.o Triangle.o $(CFLAGS) $(LIBS)
    $(CC) -o verify_triangle_test verify_triangle_test.o Triangle.o $(CFLAGS) $(LIBS)
    $(CC) -o validate_input_test validate_input_test.o Triangle.o $(CFLAGS) $(LIBS)
    $(CC) -o get_side_length_test get_side_length_test.o Triangle.o $(CFLAGS) $(LIBS)

test-all:
    ./area_of_triangle_test > test_log.txt
    ./verify_triangle_test >> test_log.txt
    ./validate_input_test >> test_log.txt
    ./get_side_length_test >> test_log.txt

.PHONY: clean

clean:
     rm *.o $(objects) Trianglecalc area_of_triangle_test verify_triangle_test validate_input_test get_side_length_test

我一直遵循此指南来创建我的makefile: A Simple Makefile Tutorial

这是如上所述重组我的项目后我的makefile的样子。此makefile在src目录中:

CC=gcc
IDIR=../include
CFLAGS=-I$(IDIR) -Wall -Wextra -Wpedantic -Werror
ODIR=obj

_DEPS = Triangle.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = Trianglecalc.o Triangle.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

_TESTOBJ = area_of_triangle_test.o verify_triangle_test.o validate_input_test.o get_side_length_test.o Triangle.o
TESTOBJ = $(patsubst %,$(ODIR)/%,$(_TESTOBJ))

LIBS=-lm

$(OBJ): $(ODIR)/%o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

Trianglecalc: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

tests: $(TESTOBJ)
    $(CC) -o area_of_triangle_test area_of_triangle_test.o Triangle.o $(CFLAGS) $(LIBS)
    $(CC) -o verify_triangle_test verify_triangle_test.o Triangle.o $(CFLAGS) $(LIBS)
    $(CC) -o validate_input_test validate_input_test.o Triangle.o $(CFLAGS) $(LIBS)
    $(CC) -o get_side_length_test get_side_length_test.o Triangle.o $(CFLAGS) $(LIBS)

test-all:
    ./area_of_triangle_test > test_log.txt
    ./verify_triangle_test >> test_log.txt
    ./validate_input_test >> test_log.txt
    ./get_side_length_test >> test_log.txt

.PHONY: clean

clean:
    rm *.o $(objects) Trianglecalc area_of_triangle_test verify_triangle_test validate_input_test get_side_length_test

按照上面链接的指南,我最初将$(OBJ): $(ODIR)/%o: %.c $(DEPS)称为$(ODIR)/%o: %.c $(DEPS),但是随后出现错误:

$ make
    make: *** No rule to make target 'obj/Trianglecalc.o', needed by 'Trianglecalc'. Stop.

我按照此答案的建议将行更改为$(OBJ): $(ODIR)/%o: %.c $(DEPS)Makefile C subdirectory rule to make obj 但现在我得到了:

$ make
    make: *** No rule to make target 'Trianglecalc..c', needed by 'obj/Trianglecalc.o'. Stop.

我链接的上一篇文章表明,这可能是由于拼写错误引起的,但我找不到它。我对make最终以Trianglecalc..c而不是Trianglecalc.c感到困惑,makefile中唯一带有..的位置是IDIR变量的一部分。有什么建议吗?

P.S。我还没有更新tests:clean:规则,但是我敢肯定至少clean:规则将需要修复。尽我所能告诉我们当前的问题是Trianglecalc:规则。

0 个答案:

没有答案