Como suprimir avisos do GCC dos cabeçalhos da biblioteca?

126

Eu tenho um projeto que usa as bibliotecas log4cxx, boost, etc. cujos cabeçalhos geram muitos avisos (repetitivos). Existe uma maneira de suprimir avisos de inclusões de biblioteca (por exemplo, #include <some-header.h>) ou inclusões de determinados caminhos? Eu gostaria de usar -Wall e / ou -Wextra como de costume no código do projeto sem que as informações relevantes sejam ocultadas. Atualmente, uso grep no make output, mas gostaria de algo melhor.

AdSR
fonte

Respostas:

127

Você pode tentar incluir cabeçalhos de biblioteca usando em -isystemvez de -I. Isso os tornará "cabeçalhos do sistema" e o GCC não relatará avisos para eles.

Phi
fonte
11
Se você estiver tentando fazer isso no XCode, cole o caminho do sistema nos "outros sinalizadores do C ++" nos "sinalizadores do compilador personalizado" nas configurações de construção de destino.
precisa
3
Uma desvantagem potencial é que, em algumas plataformas, o g ++ envolve automaticamente todos os cabeçalhos do sistema extern "C", causando erros estranhos na ligação C se você tiver #includeum cabeçalho C ++ em um -isystemcaminho.
Tavian Barnes
1
+1 me ajudou a resolver problemas com irritantes impulso avisos stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom
3
Por que isso tem muito mais votos do que a resposta do OP que disse exatamente a mesma coisa 1,5 horas antes?
underscore_d
1
Para Xcode: E se não houvesse um caminho de pasta em "Outros sinalizadores de C ++" nas minhas configurações de criação de destino? Alguém poderia elaborar essas soluções?
Ossir
107

Para aqueles que usam o CMake, você pode modificar suas include_directoriesdiretivas para incluir o símbolo SYSTEMque suprime avisos contra esses cabeçalhos.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
Drew Noakes
fonte
E se a biblioteca fornecer uma ${LIBFOO_USE_FILE}variável que será usada com o comando include () do CMake ?
21816 Waldyrious #
2
Esta parece ser quase a solução para o meu problema. Eu tenho 1.) um destino binário, que depende de 2.) um cabeçalho apenas alvo escrito por mim, que depende de 3.) algumas bibliotecas externas. Não faço ideia de como obter apenas avisos para 1 e 2. Você tem alguma ideia?
knedlsepp
2
Não parece funcionar. Eu tentei isso com um projeto que usa easylogging++e recebo a mesma quantidade enorme de avisos, easylogging++.hmesmo que a pasta em que ele reside tenha sido incluída com a SYSTEMopção.
Rbaleksandar #
Muito obrigado por isso. Ele me salvou de páginas e páginas de avisos.
Svalorzen 21/03
1
O mesmo comentário da resposta aceita: essa é uma prática ruim para mim.
Raffi
55

Você pode usar pragmas. Por exemplo:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop
andrewrjones
fonte
3
Disponível apenas com GCC> = 4.6
Caduchon
1
Eu estou amando a capacidade de empurrar / pop pragmas. Lembro-me de algo como java disponível há alguns anos e estar frustrado / com ciúmes de C / C ++. eu amo que isso esteja disponível em #gcc
Trevor Boyd Smith
@TrevorBoydSmith MS também cltem capacidade há anos ... Às vezes gccé um pouco lento para se adaptar.
Alexis Wilke
29

Eu encontrei o truque. Para biblioteca inclui, em vez de -Idirusar -isystem dirno makefile. O GCC trata o impulso etc., pois o sistema inclui e ignora todos os avisos deles.

AdSR
fonte
Observe que, se você usar o cabeçalho pré-compilado, precisará adicionar o sinalizador ao compilar o cabeçalho e o código.
user202729
9

#pragmasão instruções para o compilador. você pode definir algo antes do #include e desabilitá-lo depois.

Você também pode fazer isso na linha de comando .

Outra página do GCC especificamente sobre a desativação de avisos .

Eu optaria pela opção de usar # pragma's no código-fonte e, em seguida, fornecer uma boa razão (como um comentário) do motivo pelo qual você está desativando os avisos. Isso significaria raciocínio sobre os arquivos de cabeçalho.

O GCC aborda isso classificando os tipos de aviso. Você pode classificá-los como avisos ou a serem ignorados. Os artigos vinculados anteriormente mostrarão quais avisos podem ser desativados.

Nota: você também pode massagear o código fonte para evitar certos avisos usando atributos ; no entanto, isso o vincula bastante ao GCC.

Nota2: O GCC também usa a interface pop / push, conforme usada no compilador da microsoft - a Microsoft desativa os avisos por essa interface. Sugiro que você investigue mais, pois não sei se é possível.

Hassan Syed
fonte
Eu considerei pragmas, mas se eu suprimir um aviso antes de incluir um cabeçalho, como faço para configurá-lo de volta ao estado anterior após #include? Quero ver todos os avisos para o código do projeto (já me ajudou algumas vezes), mas tenho controle na linha de comando.
AdSR
4

Você pode tentar usar cabeçalhos pré-compilados . Os avisos não desaparecem, mas pelo menos os não aparecem na sua compilação principal.

Pablo Santa Cruz
fonte
1
Isso pode realmente ser uma boa ideia. As inclusões de terceiros não mudam todos os dias.
ADSR
Exatamente. Embora eu não os tenha usado tanto no Linux, eles funcionam muito bem no Visual Studio.
Pablo Santa Cruz
Não, eles ainda vão aparecer na compilação menos que você use alguma outra maneira de suprimi-los (tais como -isystem, mas não se esqueça de usá-lo tanto na compilação do cabeçalho e no código)
user202729
2

Se você precisar substituir explicitamente um cabeçalho do sistema, estará restrito a pragmas. Você pode verificar qual inclui o que está usando via make dependsaída.

Consulte também push-pop de diagnóstico para gcc> = 4.6

supaflav
fonte
1

Colocando o seguinte

#pragma GCC system_header

desativará os avisos do GCC para todos os códigos a seguir neste arquivo.

Evgenii
fonte
-9

Deve haver razões para esses avisos. Isso será causado por erros no seu código que usa a biblioteca ou por erros no próprio código da biblioteca. No primeiro caso, corrija seu código. No segundo caso, pare de usar a biblioteca ou, se for o código FOSS, corrija-o.


fonte
+1 para um bom conselho: D, mas ele está perguntando como fazer algo específico: D
Hassan Syed
4
Alguns avisos são impossíveis ou muito difíceis de corrigir, especialmente em códigos de terceiros, especialmente em códigos ricos em metaprogramações como os do Boost.
ulidtko
3
Pior ainda, o que está me incomodando é "a declaração de 'c' sombreia um membro 'this' [-Werror = shadow]" profundamente, profundamente em algum cabeçalho de impulso. Isso certamente não é um problema, mas problemas semelhantes estão divulgando resultados e tornando difícil para mim encontrar instâncias uma verdadeira sombra em nossa base de código.
dmckee --- gatinho ex-moderador