2010-11-16 5 views
9

Yo uso qmake como constructor de archivos y me quiero adherir a él. Además, me gustaría usar "gcc -Wall -Werror -Wundef -Wextra" para obtener un código robusto. Estoy pensando en "-pedante", pero eso está más avanzado. Mi principal problema en este momento son las toneladas de advertencias generadas por bibliotecas como boost, partes de qt y similares.Existe la posibilidad de pasar incluye a través de -isistema al usar qmake

En el momento en que utilizo pragmas cada vez que se incluyen las cabeceras de generación de advertencia

#pragma GCC diagnostic ignored "-Wall" 
    #include <QtGui> 
    ... 
    #include <QWidget> 
    #pragma GCC diagnostic error "-Wall" 

Esto está lejos de ser lindo, bastante tedioso y engorroso especialmente en lo que otros programadores tienen que hacer lo mismo. Hay una opción que usa qmake que permite incluir qt-libraries como encabezados del sistema, , y así suprimir sus advertencias. Para makefiles simples y conocidos, conozco el sistema, pero no puedo encontrar un colgante qmake para esto.

+0

parece que este es un problema conocido https: //bugreports.qt- project.org/browse/QTBUG-7220. Parches aceptados? – nonsensickle

Respuesta

8

La manera más fácil que encontré es incluir directamente a través de QMAKE_CXXFLAGS p. Boost para esto se parece a lo siguiente en el archivo de proyecto

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0 
+0

Parece que es un problema conocido: https://bugreports.qt-project.org/browse/QTBUG-7220 – nonsensickle

+0

Tomáš Zato proporciona una [implementación condicional QtCreator inteligente de esto] (http://stackoverflow.com/a/34928648/527489) que le proporciona esto mientras compila sin romper la integración IDE. – sage

1

Dado que muchas configuraciones están codificadas en archivos de especificaciones, creo que debe crear las suyas propias. Comience leyendo mkspecs/linux-g ++/qmake.conf o mkspecs/win32-g ++/qmake.conf

Verá que, de manera predeterminada, CONFIG usa la configuración warn_on. y en mkspecs/comunes/g ++ tiene

QMAKE_CFLAGS_WARN_ON += -Wall -W 
QMAKE_CFLAGS_WARN_OFF += -w 
QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON 
QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF 

para que pueda cambiar el archivo de especificaciones por defecto y hacer nuevos ajustes para cada proyecto, o puede establecer estas variables en el archivo de proyecto.

CONFIG += warn_on 
QMAKE_CFLAGS_WARN_ON = -Wall -Werror -Wundef -Wextra -pedantic 
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON 

qt son: la ruta está codificado en mkspecs/características/qt.prf como

#handle includes 
INCLUDEPATH = $$QMAKE_INCDIR_QT $$INCLUDEPATH #prepending prevents us from picking up "stale" includes 

Usted no quiere QMAKE_INCDIR_QT a ser una parte de INCLUDEPATH ya que sus componentes se unen con -I. Desea expandirlo como $$ join (QMAKE_INCDIR_QT, "-isystem", "-isystem") en otro lugar ...

3

simplemente he añadido esto a mi macx-ruido metálico/qmake.conf:

QMAKE_CXXFLAGS += $$join(QMAKE_INCDIR_QT, " -isystem", "-isystem")

funciona muy bien ahora.

-4

Tenga en cuenta que la respuesta correcta a éste es el uso de la palabra clave del sistema en la macro include_target():

include_directories(SYSTEM ${QT_INCLUDES}) 

Esto funciona para muchas bibliotecas, no sólo Qt que podría utilizar sin demasiados problemas. Pero el MagiC++. H es realmente una horrible pieza de trabajo en comparación y tuve que tener esta capacidad.

Puede encontrar más información sobre esta cuestión:

Use -isystem instead of -I with CMake

+0

Podría ser la respuesta correcta si la pregunta fuera sobre CMake, pero dado que se trata de QMake, es posible que deba verificar que ... – boycy

+0

@boycy, Ha! ¡Decir ah! ¡Buen punto! Eso definitivamente no ayudaría con qmake. Mi error. –

0

se le ocurrió una solución: cambiar manualmente Makefile.

Añada esta línea al archivo .pro

system(./suppress_system_warnings.sh) 

y luego crear un archivo ejecutable suppress_system_warnings.sh

#!/bin/bash 
run_in_background() { 
    pidof qmake > /dev/null 
    while [ $? -eq 0 ] 
    do 
     sleep 0.2 
     pidof qmake > /dev/null 
    done 

    file=Makefile 
    new_line=$(grep ^INCPATH $file | sed 's:-I\/:-isystem\/:g' | sed 's:-I\$:-isystem\$:') 
    line_num=$(grep -n ^INCPATH $file | cut -d':' -f1) 

    head -n $(expr $line_num - 1) $file > __tmp 
    echo $new_line >> __tmp 
    tail -n +$(expr $line_num + 1) $file >> __tmp 

    mv __tmp $file 
    exit 0; 
} 

run_in_background & 
exit 0; 
Cuestiones relacionadas