Tôi đang chạy một Makefile đơn giản với không có vấn đề:Makefile quy tắc C thư mục con để làm cho obj
CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o
%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o [email protected] $^ $(CFLAGS)
Các tập tin nằm trong thư mục chính của dự án của:
./project/Makefile
./project/hellomake.c
./project/hellomake.h
Sau đó, tôi đã cố gắng để các tập tin tổ chức và đặt các thông tin như:
./project/Makefile
./project/src/hellomake.c
./project/include/hellomake.h
và thư mục con phụ khác:
./project/lib
./project/obj
Sau đó, phiên bản mới của Makefile:
IDIR =include
CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I$(IDIR)
ODIR=obj
LDIR =lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o [email protected] $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
Tôi đang biên soạn trên Linux sử dụng Emacs với trình biên dịch gcc:
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Sau đó, tôi chạy trên Emacs:
<Esc>
x
compile
make
Và nó cung cấp thông báo:
"./project/src/" -*-
make: *** No rule to make target `obj/hellomake.o', needed by `hellomake'. Stop.
Compilation exited abnormally with code 2 at Wed Oct 3 17:10:01
Quy tắc nào cần được đưa vào tệp Makefile?
Tất cả nhận xét và đề xuất đều được đánh giá cao.
Cảm ơn đề xuất của bạn, nó được thêm vào mã. Sau đó trình biên dịch khiếu nại:
make -k
make: *** No rule to make target `src/hellomake.c', needed by `obj/hellomake.o'.
make: *** No rule to make target `../include/hellomake.h', needed by `obj/hellomake.o'.
make: Target `obj/hellomake.o' not remade because of errors
Một số đề xuất khác?
Cảm ơn trước!
'dự án/obj' sẽ tad hợp lý hơn' project/src/obj' –
Xin chào Steve-o. Cảm ơn! Tôi đã thực hiện thay đổi bạn đã đề xuất. – ThreaderSlash