2012-10-15 49 views
10

Tôi có một chương trình C++ mà người khác đã tạo một tệp. Tôi muốn biên dịch chương trình với cờ -g, nhưng tôi không biết nơi để thêm nó. Dưới đây là tạo tệp.Làm thế nào để thêm biên dịch flag -g vào một tập tin?

CC = g++ 
LOADLIBES = -lm 
CFLAGS = -Wall -O2 


SRC1 = Agent.cpp Breeder.cpp CandidateSolution.cpp \ 
    Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp \ 
    fitness.cpp 

SRC2 = main.cpp 

SRC = $(SRC1) $(SRC2) 

OBJS = $(SRC1:.cpp = .o) 

AUX = $(SRC1:.c = .h) 


main: $(OBJS) 
# $(CC) $(CFLAGS) -o $(SRC) $(AUX) 

.PHONY: clean 
clean: 
    rm -f *.o main 

Tôi nên thêm ở đâu tôi muốn sử dụng -g?

+0

Điều này q uestion thực sự không có gì để làm với C + +, vì vậy tôi loại bỏ các [c + +] tag –

+5

Theo Robᵩ nó –

+0

Câu hỏi này là về cách sử dụng một Makefile. Không có gì trong câu hỏi này về ngôn ngữ C++. Bạn tình cờ sử dụng make để xây dựng một chương trình được viết bằng C++, nhưng thực tế là nó được viết bằng C++ là trực giao. Mã của bạn cũng có thể được viết bằng FORTRAN. –

Trả lời

11

$ (CC) được sử dụng để biên dịch chương trình C. $ (CXX) được sử dụng để biên dịch chương trình C++. Tương tự $ (CFLAGS) được sử dụng cho các chương trình C, $ (CXXFLAGS) được sử dụng để biên dịch C++.

Thay đổi một vài dòng đầu tiên này:

#CC = g++ 
LOADLIBES = -lm 
CXXFLAGS = -Wall -O2 -g 

(Nhưng xem ghi chú của người khác về sự không tương thích giữa -O2 và -g.)

Loại bỏ các không gian bên trong dấu ngoặc đơn trong dòng này :

OBJS = $(SRC1:.cpp=.o) 

Thay đổi main dòng này:

main: $(OBJS) $(SRC2) 
# Built by implicit rules 

Các makefile kết quả sẽ giống như thế này:

#CC = g++ 
LOADLIBES = -lm 
CXXFLAGS = -Wall -O2 -g 


SRC1 = Agent.cpp Breeder.cpp CandidateSolution.cpp \ 
    Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp \ 
    fitness.cpp 

SRC2 = main.cpp 

SRC = $(SRC1) $(SRC2) 

OBJS = $(SRC1:.cpp=.o) 

AUX = $(SRC1:.c=.h) 

main: $(OBJS) $(SRC2) 
# Built by implicit rules 

.PHONY: clean 
clean: 
    rm -f *.o main 

và đầu ra sẽ trông như thế này:

$ make 
g++ -Wall -O2 -g -c -o Agent.o Agent.cpp 
g++ -Wall -O2 -g -c -o Breeder.o Breeder.cpp 
g++ -Wall -O2 -g -c -o CandidateSolution.o CandidateSolution.cpp 
g++ -Wall -O2 -g -c -o Cupid.o Cupid.cpp 
g++ -Wall -O2 -g -c -o FateAgent.o FateAgent.cpp 
g++ -Wall -O2 -g -c -o Grid.o Grid.cpp 
g++ -Wall -O2 -g -c -o Reaper.o Reaper.cpp 
g++ -Wall -O2 -g -c -o fitness.o fitness.cpp 
g++ -Wall -O2 -g main.cpp Agent.o Breeder.o CandidateSolution.o Cupid.o FateAgent.o Grid.o Reaper.o fitness.o -lm -o main 

Để hoàn chỉnh, đây là phiên bản thực hiện tôi đang sử dụng trên Ubuntu 10.04:

$ make -v 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for i486-pc-linux-gnu 
+0

Kết quả đầu ra '# g ++ -o Agent.cpp Breeder.cpp CandidateSolution.cpp Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp fitness.cpp main.cpp Agent.cpp Breeder.cpp CandidateSolution.cpp Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp fitness.cpp' nhưng không ' t tạo ra một tập tin chính. –

+0

Xem chỉnh sửa của tôi bằng makefile thực tế và đầu ra thực tế. –

+0

'Makefile: 23: *** dấu phân tách bị thiếu. Stop.' Tôi quên đề cập đến tôi sử dụng máy Mac 'GNU Make 3.81 Bản quyền (C) 2006 Free Software Foundation, Inc. Đây là phần mềm miễn phí; xem nguồn để sao chép các điều kiện. Không có bảo hành; thậm chí không cho SỞ HỮU HOẶC PHÙ HỢP CHO MỘT SỐ MỤC ĐÍCH CỤ THỂ. Chương trình này được xây dựng cho i386-apple-darwin10.0' –

3

Bạn cần phải bỏ ghi chú dòng:

# $(CC) $(CFLAGS) -o $(SRC) $(AUX) 

(loại bỏ các tiếng thở dài băm):

$(CC) $(CFLAGS) -o $(SRC) $(AUX) 

Và thay đổi

CFLAGS = -Wall -O2 

để

CFLAGS = -Wall -O2 -g 

Nhưng bạn có thể tìm gỡ lỗi dễ dàng hơn nếu bạn vô hiệu hóa tối ưu hóa bằng cách loại bỏ -O2:

CFLAGS = -Wall -g 
+0

Điều này cho tôi một lỗi ld và xóa Agent.cpp –

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