2012-02-13 36 views
5

Tôi vừa bắt đầu học Linux và tôi gặp một số vấn đề khi vô hiệu hóa tối ưu hóa của GCC cho một trong các dự án C++ của tôi.Làm cách nào để vô hiệu hóa tối ưu hóa GCC khi sử dụng makefiles?

Dự án được xây dựng với makefiles như vậy ...

make -j 10 && make install 

Tôi đã đọc trên các trang web khác nhau mà các lệnh để vô hiệu hóa tối ưu hóa là một cái gì đó dọc theo dòng của ...

gcc -O0 <your code files> 

Ai đó có thể giúp tôi áp dụng điều này để makefiles thay vì mã cá nhân? Tôi đã tìm kiếm hàng giờ và đã đưa tay trắng ra.

+10

nó sẽ khó đề xuất chỉnh sửa cho Makefile mà chúng tôi không thể thấy – sehe

+0

-O0 là mặc định nếu bạn không chỉ định mức tối ưu hóa. Bạn có thể muốn sử dụng cờ -g vì điều này tạo ra các biểu tượng gỡ lỗi. –

+0

Xin lỗi vì trả lời trễ, tôi đã khá bận rộn. Đây là một trong các makefiles: http://pastebin.com/ftvXEFbv – inline

Trả lời

5

Trong một số cài đặt makefile tiêu chuẩn mà bạn có thể

make -j10 -e CPPFLAGS=-O0 

Nhưng makefile có thể sử dụng biến thay thế khác hoặc ghi đè lên môi trường. Bạn cần phải cho chúng ta thấy Makefile để kiến ​​nghị sửa đổi

+5

'CPPFLAGS' thường là viết tắt của cờ tiền xử lý C,' CXXFLAGS' là các cờ cho trình biên dịch C++. – Fanael

+0

@ Fanael trong khi điều đó có thể đúng, 'CPPFLAGS' thường được thêm vào' CXXFLAGS' và 'CFLAGS' làm cho nó trở thành điểm vào chung hơn. – sehe

+0

@ Fanael: Quy tắc mặc định cho các tệp C++ là '$ (CXX) -c $ (CPPFLAGS) $ (CXXFLAGS)' –

0

Ví dụ, một sưu tập được tối ưu hóa có thể được viết như sau:

all: 
    g++ -O3 main.cpp 

Một biên soạn với các thông tin gỡ lỗi (không tối ưu hóa) có thể được viết như sau:

all: 
    g++ -g main.cpp 
+0

Không ai viết một makefile như thế. Trong thực tế, bạn thậm chí không cần một tập tin cho rằng chỉ cần gõ 'make main' –

+0

Tất nhiên, nó không phải là một makefile có thể sử dụng được.Chỉ là một ví dụ tối thiểu về cách bật/tắt tối ưu hóa. – rasmus

3

Cách đơn giản nhất (hữu ích) makefile cho phép chế độ debug/release là:

# 
# Define the source and object files for the executable 
SRC  = $(wildcard *.cpp) 
OBJ  = $(patsubst %.cpp,%.o, $(SRC)) 

# 
# set up extra flags for explicitly setting mode 
debug:  CXXFLAGS += -g 
release: CXXFLAGS += -O3 

# 
# Link all the objects into an executable. 
all: $(OBJ) 
    $(CXX) -o example $(LDFLAGS) $(OBJ) $(LOADLIBES) $(LDLIBS) 

# 
# Though both modes just do a normal build. 
debug:  all 
release: all 

clean: 
    rm $(OBJ) 

Cách sử dụng Mặc định xây dựng (Không tối ưu hóa nhất định)

> make 
g++ -c -o p1.o p1.cpp 
g++ -c -o p2.o p2.cpp 
g++ -o example p1.o p2.o 

Cách sử dụng: Phát hành xây dựng (sử dụng O3)

> make clean release 
rm p1.o p2.o 
g++ -O3 -c -o p1.o p1.cpp 
g++ -O3 -c -o p2.o p2.cpp 
g++ -o example p1.o p2.o 

Cách sử dụng: Debug xây dựng (sử dụng -g)

> make clean debug 
rm p1.o p2.o 
g++ -g -c -o p1.o p1.cpp 
g++ -g -c -o p2.o p2.cpp 
g++ -o example p1.o p2.o 
+0

Lưu ý rằng các biến cụ thể mục tiêu của bạn sẽ không hoạt động khi mục tiêu khác với 'debug' hoặc' release' được chỉ định. Một cách mạnh mẽ hơn là http://stackoverflow.com/a/5153406/412080 –

+0

@MaximYegorushkin: Nó hoạt động tốt với mục tiêu không được chỉ định. Nó được thiết kế để không sử dụng biến nào khi bạn không chỉ định bất cứ điều gì. Nó sẽ sử dụng quy tắc đầu tiên 'all' chỉ xây dựng mã. **Như được trình bày ở trên**. Tôi thấy không có lợi thế cho makefile bạn liên kết quá. Nó chắc chắn ** không mạnh mẽ hơn **. Nó chỉ làm điều tương tự bằng cách sử dụng một kỹ thuật khác nhau (trừ khi bạn chỉ định một cái gì đó nó mặc định là -g (đó không phải là những gì tôi muốn)). –

+0

Phải, nó sẽ không hoạt động cho 'thực hiện điều này', chỉ cho 'make',' make debug' và 'make release'. –

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