Tôi đang gặp khó khăn khi cố gắng sử dụng để đặt các tệp đối tượng trong một thư mục con riêng biệt, có lẽ là một kỹ thuật rất cơ bản. Tôi đã cố gắng sử dụng các thông tin trong trang này: http://www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-TypesCách đặt các tệp đối tượng trong thư mục con riêng biệt
tôi nhận được đầu ra sau đây từ thực hiện: thực hiện: *** Không có quy tắc để thực hiện mục tiêu ku.h', needed by
obj/kumain.o'. Dừng lại.
Tuy nhiên ku.h là phụ thuộc không phải là mục tiêu (mặc dù rõ ràng là #included trong các tệp nguồn c). Khi tôi không cố gắng sử dụng một thư mục con cho các tệp đối tượng (nghĩa là bỏ qua các phần OBJDIR) nó hoạt động tốt. Tại sao nghĩ rằng ku.h là một mục tiêu?
makefile của tôi là thế này: (phong cách là sau khi đọc các nguồn thông tin khác nhau)
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
VPATH=%.c src
VPATH=%.h src
VPATH=%.o obj
OBJDIR=obj
objects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o)
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
.PHONY: clean
clean :
rm $(objects)
Edit: tôi áp dụng sự thay đổi để sử dụng các chỉ thị vpath. Phiên bản của tôi là một hỗn hợp xấu của VPATH = xxx và vpath% .c xxx. Tuy nhiên bây giờ tôi nhận được một vấn đề khác (đó là vấn đề ban đầu trước khi tôi thêm vào các vpath sai). Điều này bây giờ là kết quả:
gcc -o ku -lhpdf obj/kumain.o obj/kudlx.o obj/kusolvesk.o ..etc
gcc: obj/kumain.o: No such file or directory
gcc: obj/kudlx.o: No such file or directory
gcc: obj/kusolvesk.o: No such file or directory
gcc: obj/kugetpuz.o: No such file or directory
gcc: obj/kuutils.o: No such file or directory
gcc: obj/kurand.o: No such file or directory
gcc: obj/kuASCboard.o: No such file or directory
gcc: obj/kuPDFs.o: No such file or directory
gcc: obj/kupuzstrings.o: No such file or directory
gcc: obj/kugensud.o: No such file or directory
gcc: obj/kushapes.o: No such file or directory
make: *** [ku] Error 1
Có vẻ làm mà không áp dụng các quy tắc ngầm cho một tập tin đối tượng mặc dù hướng dẫn nói "quy tắc ngầm nói làm thế nào để sử dụng các kỹ thuật thông để bạn không cần phải chỉ định Ví dụ, có một quy tắc ngầm cho việc biên dịch C. Các tên tệp xác định các quy tắc ngầm định được chạy, ví dụ, trình biên dịch C thường lấy một tệp .c và tạo một tệp .o. áp dụng quy tắc ngầm cho việc biên dịch C khi nó thấy sự kết hợp của đuôi tên tệp. " và cũng "Tìm kiếm thông qua các thư mục được chỉ định trong VPATH hoặc với vpath cũng xảy ra trong khi xem xét các quy tắc ngầm định (xem Sử dụng quy tắc ngầm định)."
Một lần nữa ở đây "Ví dụ: khi tệp foo.o không có quy tắc rõ ràng, hãy xem xét các quy tắc ngầm định, chẳng hạn như quy tắc dựng sẵn để biên dịch foo.c nếu tệp đó tồn tại. thư mục hiện tại, các thư mục thích hợp được tìm kiếm cho nó.Nếu foo.c tồn tại (hoặc được đề cập trong makefile) trong bất kỳ thư mục nào, thì quy tắc ngầm cho việc biên dịch C được áp dụng. "
Bất kỳ hỗ trợ nào trong việc đưa ra các quy tắc ngầm để làm việc cho makefile của tôi sẽ được đánh giá cao.
Chỉnh sửa số 2: Cảm ơn Jack Kelly Tôi đã thực hiện một quy tắc rõ ràng để biên dịch tệp .c vì tôi không thể tìm bất kỳ nơi nào cố gắng sử dụng quy tắc ngầm. Cũng nhờ al_miro cho thông tin vpath.
Đây là makfile làm việc:
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
OBJDIR=obj
vpath %.c src
vpath %.h src
objects = $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o)
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(OBJDIR) obj/%.o : %.c ku.h kudefines.h kuglobals.h kufns.h
$(CC) -c $(CPPFLAGS) $< -o [email protected]
.PHONY : clean
clean :
rm $(objects)
Phong cách lưu ý: '$ (CPPFLAGS)' theo truyền thống được sử dụng cho cờ C Preprocessor, trong khi '$ (CFLAGS)' được sử dụng cho cờ cho trình biên dịch. –