2012-02-13 18 views
5

Ho appena iniziato a studiare Linux e sto avendo qualche problema disabilitando l'ottimizzazione di GCC per uno dei miei progetti C++.Come disabilitare l'ottimizzazione GCC quando si utilizzano i makefile?

Il progetto è costruito con makefiles in questo modo ...

make -j 10 && make install 

Ho letto su vari siti che il comando per disattivare l'ottimizzazione è qualcosa sulla falsariga di ...

gcc -O0 <your code files> 

Qualcuno potrebbe aiutarmi ad applicarlo ai makefile anziché al codice individuale? Ho cercato ore e sono venuto a mani vuote.

+10

sta andando essere difficile proporre modifiche a un Makefile che non possiamo vedere – sehe

+0

-O0 è l'impostazione predefinita se non si specifica un livello di ottimizzazione. Potresti voler usare il flag -g mentre questo genera i simboli di debug. –

+0

Scusate per la risposta tardiva, sono stato piuttosto occupato. Ecco uno dei makefile: http://pastebin.com/ftvXEFbv – inline

risposta

5

In alcune impostazioni Makefile standard, si potrebbe

make -j10 -e CPPFLAGS=-O0 

Ma il makefile potrebbe utilizzare altre variabili di sostituzione o di ignorare l'ambiente. È necessario per mostrarci il Makefile al fine di proporre le modifiche

+5

'CPPFLAGS' spesso significa flag di preprocessore C,' CXXFLAGS' sono i flag per il compilatore C++. – Fanael

+0

@Fanael mentre ciò può essere vero, 'CPPFLAGS' viene in genere aggiunto a' CXXFLAGS' e 'CFLAGS' che lo rende il punto di ingresso più generale. – sehe

+0

@Fanael: la regola predefinita per i file C++ è '$ (CXX) -c $ (CPPFLAGS) $ (CXXFLAGS)' –

0

Per esempio, una compilation ottimizzate possono essere scritte come:

all: 
    g++ -O3 main.cpp 

una compilation con le informazioni di debug (nessuna ottimizzazione) può essere scritta come:

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

Nessuno scrive un makefile del genere. In realtà non hai nemmeno bisogno di un file per questo basta digitare 'make main' –

+0

Ovviamente, non è un makefile utilizzabile.Solo un esempio minimo di come abilitare/disabilitare le ottimizzazioni. – rasmus

3

Il più semplice (utile) makefile che permette la modalità di debug/release è:

# 
# 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) 

Uso accumulo di default (No ottimizzazioni specificati)

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

Usage: Release build (usa -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 

Usage: debug build (usa-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

Si noti che le variabili specifiche del target non funzioneranno quando viene specificato un target diverso da 'debug' o' release'. Un modo più efficace è http://stackoverflow.com/a5153406/412080 –

+0

@MaximYegorushkin: Funziona perfettamente senza target specificato. È progettato per non utilizzare variabili quando non si specifica nulla. Utilizzerà la prima regola 'all' che semplicemente costruisce il codice. ** Come mostrato sopra **. Non vedo alcun vantaggio per il makefile che colleghi anche tu. È sicuramente ** non più ** robusto. Fa semplicemente la stessa cosa usando una tecnica diversa (eccetto a meno che tu non specifichi qualcosa per impostazione predefinita -g (che non è ciò che vorrei)). –

+0

Esatto, non funzionerà con 'make this that', solo per' make', 'make debug' e' make release'. –

Problemi correlati