라이브러리 헤더에서 GCC 경고를 억제하는 방법은 무엇입니까?


126

헤더가 많은 (반복적) 경고를 생성하는 log4cxx, boost 등 라이브러리를 사용하는 프로젝트가 있습니다. 라이브러리 포함 (예 : #include <some-header.h>) 또는 특정 경로의 포함에서 경고를 억제하는 방법이 있습니까? 관련 정보를 모호하게하지 않고 프로젝트 코드에서 평소처럼 -Wall 및 / 또는 -Wextra를 사용하고 싶습니다. 현재 make output에 grep을 사용하지만 더 나은 것을 원합니다.

답변:


127

-isystem대신을 사용하여 라이브러리 헤더를 포함 할 수 있습니다 -I. 이렇게하면 "시스템 헤더"가되고 GCC는 경고를보고하지 않습니다.


11
XCode에서이 작업을 수행하려는 경우 대상 빌드 설정의 "사용자 지정 컴파일러 플래그"에서 "다른 C ++ 플래그"에 -isystem 경로를 붙입니다.
Matt Parkins

3
한 가지 잠재적 인 단점은 일부 플랫폼에서 g ++가 모든 시스템 헤더를 자동으로 래핑 하여 경로 에 C ++ 헤더가있는 extern "C"경우 C 연결에 대한 이상한 오류를 유발한다는 것 입니다. #include-isystem
Tavian Barnes

1
+1은 성가신 부스트 경고 문제를 해결하는 데 도움이되었습니다. stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom

3
1.5 시간 전에 정확히 똑같은 내용을 말한 OP의 자체 답변보다 더 많은 표가있는 이유는 무엇입니까?
underscore_d

1
Xcode의 경우 : 대상 빌드 설정의 "기타 C ++ 플래그"에 폴더 경로가 없으면 어떻게됩니까? 누군가이 솔루션에 대해 자세히 설명 할 수 있습니까?
Ossir 2010 년

107

CMake를 사용 하는 경우 이러한 헤더에 대한 경고를 억제 include_directories하는 기호를 포함하도록 지시문을 수정할 수 SYSTEM있습니다.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

라이브러리 ${LIBFOO_USE_FILE}가 CMake의 include () 명령 과 함께 사용할 변수를 제공하면 어떻게됩니까?
waldyrious

2
이것은 내 문제에 대한 거의 해결책 인 것 같습니다. 나는 1.) 바이너리 타겟, 2.) 자신이 작성한 헤더 전용 타겟, 3.) 일부 외부 라이브러리에 의존합니다. 1 & 2에 대한 경고 만받는 방법을 모르겠습니다. 당신은 어떤 아이디어가 있습니까?
knedlsepp

2
작동하지 않는 것 같습니다. 나는 이것을 사용하는 프로젝트로 시도했고 그것이 상주하는 폴더가 옵션 에 포함되어 있더라도 easylogging++동일한 엄청난 양의 경고를 받았습니다 . easylogging++.hSYSTEM
rbaleksandar

이것에 대해 대단히 감사합니다. 그것은 페이지와 경고 페이지에서 나를 구했습니다.
Svalorzen

1
받아 들여진 대답과 같은 의견 : 이것은 나에게 나쁜 습관입니다.
Raffi

55

pragma를 사용할 수 있습니다. 예를 들면 :

// 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

3
GCC> = 4.6에서만 사용 가능
Caduchon

1
나는 push / pop pragma의 능력을 좋아합니다. 나는 몇 년 전에 사용 가능한 자바와 같은 것을 기억하고 C / C ++에 대해 좌절 / 질투했습니다. 나는이에 사용할 수 있는지 사랑gcc
트레버 보이드 스미스

@TrevorBoydSmith MS cl는 수년 동안 능력을 가지고있었습니다 ... 때때로 gcc적응하는 데 약간 느립니다.
Alexis Wilke

29

속임수를 찾았습니다. 라이브러리 포함의 -Idir경우 -isystem dir메이크 파일에서 사용하는 대신 . 그런 다음 GCC는 시스템이 경고를 포함하고 무시하므로 부스트 등을 처리합니다.


미리 컴파일 된 헤더를 사용하는 경우 헤더와 코드를 모두 컴파일 할 때 플래그를 추가해야합니다.
user202729

9

#pragma컴파일러에 대한 지침입니다. #include 앞에 무언가를 설정하고 나중에 비활성화 할 수 있습니다.

명령 줄 에서도 수행 할 수 있습니다 .

특히 경고 비활성화 에 관한 또 다른 GCC 페이지 입니다.

소스 코드 내에서 #pragma를 사용한 다음 경고를 비활성화하는 이유에 대한 건전한 이유 (주석으로) 를 제공하는 옵션을 선택 합니다. 이것은 헤더 파일에 대한 추론을 의미합니다.

GCC 는 경고 유형 을 분류 하여 이에 접근합니다 . 경고 또는 무시하도록 분류 할 수 있습니다. 이전에 링크 된 기사는 비활성화 될 수있는 경고를 보여줍니다.

참고 : 속성 을 사용하여 특정 경고를 방지하기 위해 소스 코드를 마사지 할 수도 있습니다 . 그러나 이것은 GCC와 매우 밀접하게 연결됩니다.

참고 2 : GCC는 Microsoft 컴파일러에서 사용되는 팝 / 푸시 인터페이스 도 사용합니다. Microsoft는이 인터페이스를 통해 경고를 비활성화합니다. 가능한지 모르겠으므로 추가로 조사해 보시기 바랍니다.


pragma를 고려했지만 헤더를 포함하기 전에 경고를 표시하지 않으면 #include 후에 이전 상태로 되돌리려면 어떻게해야 합니까? 프로젝트 코드에 대한 모든 경고 (이미 몇 번 도움이 됨)를보고 싶지만 명령 줄에서 제어 할 수 있습니다.
AdSR 2009

4

미리 컴파일 된 헤더를 사용해 볼 수 있습니다 . 경고는 사라지지 않지만 적어도 메인 컴파일에는 표시되지 않습니다.


1
이것은 실제로 좋은 생각 일 수 있습니다. 타사 포함은 매일 변경되지 않습니다.
AdSR 2009

바로 그거죠. Linux에서 그렇게 많이 사용하지는 않았지만 Visual Studio에서 잘 작동합니다.
Pablo Santa Cruz

아니, 그들은 여전히 당신이 그들을 억제하기 위해 다른 방법을 사용하지 않는 컴파일에 표시 (예를 것입니다 -isystem,하지만 코드 헤더를 컴파일과에서 모두 사용하는 기억)
user202729


1

다음을 넣어

#pragma GCC system_header

이 파일의 모든 다음 코드에 대해 GCC 경고를 끕니다.


-9

그러한 경고에 대한 이유가 있어야합니다. 이는 라이브러리를 사용하는 코드의 오류 또는 라이브러리 코드 자체의 오류로 인해 발생합니다. 첫 번째 경우에는 코드를 수정하십시오. 두 번째 경우에는 라이브러리 사용을 중지하거나 FOSS 코드 인 경우 수정하십시오.


+1 좋은 충고를 위해 : D 그러나 그는 뭔가 특정한 것을하는 방법을 묻고 있습니다 : D
Hassan Syed

4
일부 경고는 특히 타사 코드, 특히 Boost와 같은 메타 프로그래밍이 풍부한 코드에서 불가능하거나 수정하기가 매우 어렵습니다 .
ulidtko 2011-08-04

3
나를 괴롭히는 더 나쁜 것은 " 'this'[-Werror = shadow]의 멤버 인 'c'shadows 선언" 입니다. 그것은 확실히 문제는 아니지만, 그것과 유사한 문제들이 출력을 뿜어 내고 우리 코드 기반에서 인스턴스를 진짜 섀도 잉으로 찾기 어렵게 만듭니다.
dmckee --- 전 중재자 새끼 고양이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.