2012-02-13 14 views
5

Acabo de empezar a aprender Linux y estoy teniendo problemas para desactivar la optimización de GCC para uno de mis proyectos en C++.¿Cómo desactivo la optimización GCC cuando uso makefiles?

El proyecto se construye con makefiles como así ...

make -j 10 && make install 

que he leído en varios sitios que el comando para deshabilitar la optimización es algo a lo largo de las líneas de ...

gcc -O0 <your code files> 

¿Podría alguien ayudarme a aplicar esto a los archivos make en lugar de un código individual? He estado buscando durante horas y he venido con las manos vacías.

+10

que va a Sería difícil proponer ediciones a un Makefile que no podemos ver – sehe

+0

-O0 es el valor predeterminado si no especifica un nivel de optimización. Es posible que desee utilizar el indicador -g ya que esto genera símbolos de depuración. –

+0

Lo siento por la respuesta tardía, he estado bastante ocupado. Aquí está uno de los makefiles: http://pastebin.com/ftvXEFbv – inline

Respuesta

5

En algunos ajustes estándar makefile que podía

make -j10 -e CPPFLAGS=-O0 

Pero el makefile podría utilizar otras variables de sustitución o anular el medio ambiente. Es necesario que nos muestre el Makefile con el fin de proponer las modificaciones

+5

'CPPFLAGS' a menudo significa banderas de preprocesador C,' CXXFLAGS' son las banderas para el compilador de C++. – Fanael

+0

@Fanael, aunque eso puede ser cierto, 'CPPFLAGS' generalmente se agrega a' CXXFLAGS' y 'CFLAGS', lo que lo convierte en el punto de entrada más general. – sehe

+0

@Fanael: la regla predeterminada para los archivos C++ es '$ (CXX) -c $ (CPPFLAGS) $ (CXXFLAGS)' –

0

Por ejemplo, un compilaciones optimizadas se pueden escribir como:

all: 
    g++ -O3 main.cpp 

Una recopilación con información de depuración (sin optimización) se puede escribir como:

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

Nadie escribe un archivo MAKE como ese. De hecho, ni siquiera necesita un archivo para eso simplemente escriba 'make main' –

+0

Por supuesto, no es un archivo make usable.Solo un ejemplo mínimo de cómo habilitar/deshabilitar optimizaciones. – rasmus

3

El más simple (útil) makefile que permite el modo de depuración/liberación es:

# 
# 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 acumulación predeterminado (No hay optimizaciones específicas)

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

Uso: versión de lanzamiento (utiliza 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 

Uso: Depuración de construcción (utiliza -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

Tenga en cuenta que las variables específicas de su destino no funcionarán cuando se especifique un destino que no sea 'debug' o' release'. Una forma más robusta es http://stackoverflow.com/a/5153406/412080 –

+0

@MaximYegorushkin: Funciona bien sin ningún objetivo especificado. Está diseñado para no usar variables cuando no especificas nada. Utilizará la primera regla 'all' que acaba de construir el código. **Como se muestra arriba**. No veo ninguna ventaja para el archivo MAKE que también vincule. Definitivamente es ** no más robusto. Simplemente hace lo mismo con una técnica diferente (salvo que especifiques algo que por defecto es -g (que no es lo que yo quisiera)). –

+0

Correcto, no funcionará para 'make this that', solo para' make', 'make debug' y' make release'. –

Cuestiones relacionadas