2008-10-04 29 views
52

Tôi muốn thử nghiệm với tối ưu hóa toàn bộ chương trình GCC. Để làm như vậy, tôi phải chuyển tất cả các tệp C cùng một lúc sang giao diện trình biên dịch. Tuy nhiên, tôi sử dụng makefiles để tự động hóa quá trình xây dựng của mình, và tôi không phải là một chuyên gia khi nói đến ma thuật makefile.makefiles - biên dịch tất cả các tệp c cùng một lúc

Làm cách nào để tôi sửa đổi tệp makefile nếu tôi muốn biên dịch (thậm chí có thể liên kết) chỉ bằng một cuộc gọi đến GCC?

Để tham khảo - makefile của tôi trông như thế này:

LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 
CFLAGS = -Wall 

OBJ = 64bitmath.o \ 
     monotone.o  \ 
     node_sort.o \ 
     planesweep.o \ 
     triangulate.o \ 
     prim_combine.o \ 
     welding.o  \ 
     test.o   \ 
     main.o 

%.o : %.c 
    gcc -c $(CFLAGS) $< -o [email protected] 

test: $(OBJ) 
    gcc -o [email protected] $^ $(CFLAGS) $(LIBS) 

Trả lời

54
LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 
CFLAGS = -Wall 

# Should be equivalent to your list of C files, if you don't build selectively 
SRC=$(wildcard *.c) 

test: $(SRC) 
    gcc -o [email protected] $^ $(CFLAGS) $(LIBS) 
+0

Tại sao nó phải là danh sách thực tế của các tệp C thay vì ký tự đại diện? – nornagon

+7

@nornagon, s/nên/tương đương với/ –

+10

@AlexB Nói tiếng Anh. Điều đó có nghĩa là gì? – Overv

34
SRCS=$(wildcard *.c) 

OBJS=$(SRCS:.c=.o) 

all: $(OBJS) 
+0

Điều này khiến tôi không thực sự là câu trả lời cho câu hỏi ban đầu, vì nó có khả năng thực hiện nhiều cuộc gọi đến '$ {CC}'. Tôi đã có một chuyển đổi mà tôi muốn thực hiện trên một loạt các tệp văn bản, vì vậy tôi đã thêm dòng '.SUFFIXES' của riêng mình và như vậy, nhưng' $ (ký tự đại diện) 'và' $ (VARIABLE: .ext1 = .ext2) 'chuyển đổi là chính xác những gì tôi đang tìm kiếm.) Rõ ràng không bỏ phiếu lên hoặc xuống, mặc dù tôi muốn nói rằng có thể cho rằng điều này xứng đáng được bỏ phiếu * cho câu hỏi này *. – lindes

1

Bạn cần phải đưa ra quy tắc hậu tố của bạn (% .o:% .c) trong lợi của một lớn-bang qui định. Something như thế này:

LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 
CFLAGS = -Wall 

OBJ = 64bitmath.o \ 
     monotone.o  \ 
     node_sort.o \ 
     planesweep.o \ 
     triangulate.o \ 
     prim_combine.o \ 
     welding.o  \ 
     test.o   \ 
     main.o 

SRCS = $(OBJ:%.o=%.c) 

test: $(SRCS) 
    gcc -o [email protected] $(CFLAGS) $(LIBS) $(SRCS) 

Nếu bạn đang đi để thử nghiệm với tối ưu hóa toàn bộ chương trình của GCC, hãy chắc chắn rằng bạn thêm cờ thích hợp để CFLAGS, ở trên.

Khi đọc qua tài liệu cho những lá cờ đó, tôi cũng thấy ghi chú về thời gian liên kết cũng như tối ưu hóa ; bạn cũng nên điều tra.

Các vấn đề liên quan