2009-04-27 34 views
22

Tôi mới làm tệp. Tôi đã học được việc tạo ra makefile và các khái niệm liên quan khác từ cuốn sách "Quản lý dự án với GNU tạo". Makefile đã sẵn sàng ngay bây giờ và tôi cần phải chắc chắn rằng một trong đó tôi tạo ra là OK. Đây là makefileMakefile đơn giản với bản phát hành bản phát hành và gỡ lỗi - Các phương pháp hay nhất

#Main makefile which does the build 

#makedepend flags 
DFLAGS = 

#Compiler flags 
#if mode variable is empty, setting debug build mode 
ifeq ($(mode),release) 
    CFLAGS = -Wall 
else 
    mode = debug 
    CFLAGS = -g -Wall 
endif 

CC = g++ 
PROG = fooexe 

#each module will append the source files to here 
SRC := main.cpp 

#including the description 
include bar/module.mk 
include foo/module.mk 

OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) 

.PHONY:all 
all: information fooexe 

information: 
ifneq ($(mode),release) 
ifneq ($(mode),debug) 
    @echo "Invalid build mode." 
    @echo "Please use 'make mode=release' or 'make mode=debug'" 
    @exit 1 
endif 
endif 
    @echo "Building on "$(mode)" mode" 
    @echo ".........................." 

#linking the program 
fooexe: $(OBJ) 
    $(CC) -o $(PROG) $(OBJ) 

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

depend: 
    makedepend -- $(DFLAGS) -- $(SRC) 

.PHONY:clean 
clean: 
    find . -name "*.o" | xargs rm -vf 
    rm -vf fooexe 

Câu hỏi

  1. Các makefile đưa ra ở trên hoạt động tốt với phát hành và debug xây dựng. Nhưng nó có đúng định dạng không? Hay bạn có thấy bất kỳ sai sót nào trong đó không?
  2. Tệp makefile trên thực hiện gỡ lỗi theo mặc định khi được gọi bằng cách sử dụng tạo. Đối với bản phát hành bản phát hành, làm cho chế độ = release là bắt buộc. Đây có phải là cách tiếp cận chính xác không?
  3. Cờ gỡ lỗi và phát hành trình biên dịch được cung cấp cho g ++ có đúng không? Để gỡ lỗi, tôi sử dụng -g -Wall và để phát hành, chỉ -Wall. Thê nay đung không?

Mọi trợ giúp đều tuyệt vời.

+0

Bạn có đang lên kế hoạch phát hành nguồn phần mềm của mình, kể cả Makefile không? Hoặc là bạn chỉ cần vận chuyển nhị phân? I E. sẽ có ai nhưng bạn và nhóm của bạn thấy và sử dụng Makefile này? – Schwern

+0

Có. Tôi sẽ phát hành mã nguồn vì đây sẽ là một dự án mã nguồn mở. –

Trả lời

13
  1. Đây là một định dạng hợp lý. Nó được gắn đặc biệt với GNU Make, nhưng đó là một vấn đề tương đối nhỏ nếu bạn đã chọn sử dụng GNU Thực hiện trên mọi nền tảng.
    • Nếu có lỗi, bạn có thể kết nối các tệp đối tượng được xây dựng trong chế độ gỡ lỗi để tạo bản dựng cuối cùng.
    • Một số người có thể cho rằng tùy chọn 'chế độ = phiên bản' không phải là tiêu chuẩn; họ sẽ đúng, nhưng không có một giải pháp thay thế tiêu chuẩn mà tôi biết. Bạn chỉ cần lưu ý rằng quy ước của bạn có thể không phù hợp với tất cả mọi người (nhưng nó không phải - nó chỉ có phù hợp với bạn và người dùng của bạn).
  2. Xây dựng một bản dựng gỡ lỗi theo mặc định có thể là hợp lý - và hợp lý hơn là xây dựng bản phát hành theo mặc định.
  3. Bỏ cờ -g cho bản phát hành không tự động xấu, nhưng nếu mã của bạn từng tạo ra kết xuất lõi, thì dễ dàng tạo đầu hoặc đuôi của kết xuất lõi nếu tệp chương trình bao gồm thông tin gỡ lỗi. Chi phí chính của thông tin gỡ lỗi là các phần bổ sung trong tệp chương trình mà không cần phải được tải vào bộ nhớ hệ thống - chi phí thời gian chạy là nhỏ.
    • Bạn nên xem xét có bao gồm các cờ tối ưu hóa trong đó không. Với bộ công cụ GCC, bạn có thể sử dụng cả hai -g-O. Khó gỡ lỗi mã được tối ưu hóa hơn, nhưng nó mang lại cho bạn lợi ích hiệu suất (thường là đáng kể).
+0

"Nếu có lỗi, bạn có thể kết nối các tệp đối tượng được xây dựng trong chế độ gỡ lỗi để tạo bản dựng cuối cùng". Tôi không rõ ràng với tuyên bố đó. Trước khi xây dựng bản phát hành, tôi sẽ xóa tất cả các tệp đối tượng hiện có và thực hiện việc xây dựng bản phát hành. Để tôi nhận được các tệp phát hành chính xác được liên kết. Ổn chứ? Cảm ơn câu trả lời. –

+0

Giả sử bạn chạy 'make', sau đó chỉnh sửa một tệp nguồn và sau đó chạy 'make mode = release'; phần lớn các tệp đối tượng được biên dịch trong chế độ gỡ lỗi, mặc dù nó là một bản phát hành 'phát hành'. Nếu, như bạn gợi ý, bạn làm 'làm cho chế độ = phát hành sạch tất cả', sau đó bạn nên được tốt. Đó là lý do tại sao tôi không nói "Đó là một lỗ hổng"; Tôi chỉ ra rằng đó là một vấn đề có thể được nhận thức. (Ngoài ra, không có giải pháp đơn giản - bạn cần một trình theo dõi xây dựng phức tạp hơn để ghi lại cách các tệp đối tượng được tạo, bao gồm các tùy chọn trình biên dịch. Xem 'ccache' http://ccache.samba.org/ để biết ví dụ.) –

11

tôi sẽ đề nghị phương thức sau đây:

for debugger: -O0 -g -Wall 
for development and internal release: -O2 -g -Wall 
for release outside the company: -O2 -Wall 

Lý do:

  • Điều rất quan trọng để phát triển và thử nghiệm các mã trong "phương thức sản xuất".Bạn có thể tìm thấy rằng trong một số trường hợp mã hoạt động mà không có sự cố tối ưu hóa trong chế độ được tối ưu hóa vì lỗi trong mã của bạn. (Hãy tin tôi điều này xảy ra rất nhiều) - Vì vậy, hãy sử dụng -O2
  • Trong hầu hết các trường hợp, bạn vẫn có thể gỡ lỗi khá tốt ngay cả với mã được tối ưu hóa, vì vậy hãy thêm -g. Tuy nhiên, nếu quá khó để tìm lỗi trong chế độ như vậy, bạn có thể biên dịch cho trình gỡ lỗi bằng -O0
  • Chỉ khi bạn gặp sự cố bao gồm gỡ lỗi thông tin trong mã, bạn nên xóa -g. Bạn nên có -g cho mã trong môi trường sản xuất, bởi vì nếu có sự cố nào đó bạn có thể nhận được nhiều thông tin hơn.
3

Tôi muốn nhận lời khuyên của Artyom về cờ và sử dụng -O.

Lời khuyên chính của tôi là đặt chế độ mặc định là "phát hành". Không người dùng nào bên ngoài công ty của bạn biết về quy ước make mode=release của bạn và 99,99% trong số họ sẽ muốn nó được xây dựng để phát hành.

Tôi thích rằng bạn có -Wall ở tất cả các chế độ. Nếu bạn muốn trở nên thực sự ... ... -Wall -std=c++98 -pedantic -Wextra -Wconversion là một khởi đầu tốt. -std = c + + 98 có thể không cần thiết nếu bạn đã kết hợp với g ++, nhưng nếu bạn có bất kỳ ảo ảnh nào về tính di động, bạn sẽ muốn điều đó.

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