2016-08-05 6 views
0

g ++의 이상한 동작으로 인해 다른 경고가 표시 될 때 인식 할 수없는 명령 줄 옵션에 대한 경고가 표시됩니다.cc1plus : 다른 경고에 대해 인식 할 수없는 명령 줄 옵션 경고

a.cpp:2:27: warning: ‘virtual int Bar::bar()’ can be marked override [-Wsuggest-override] 
struct Bar:public Foo{int bar() {return 0;} }; 
         ^
cc1plus: warning: unrecognized command line option ‘-Wno-c99-extensions’ 

ADDITION :

예 : g++-5 -Wsuggest-override -Wno-c99-extensions -std=c++11 a.cpp 또는 g++-5 -Wsuggest-override -Wno-c99-extensions a.cpp 쇼와 함께 컴파일

struct Foo{virtual int bar() = 0;}; 
struct Bar:public Foo{int bar() {return 0;} }; 

int main(){} 

내가 g++-5 -Wno-c99-extensions a.cpp 따라서이 옵션을 사용하여 컴파일 할 때 경고/오류가 없다는 CMAKEs가 CHECK_CXX_COMPILER_FLAG

를 사용하여 체크 전달

우리는 Werror를 사용하지만 Wn을 통한 예외는 꽤 많이 신경 쓰입니다. o-error = ... "인식 할 수없는 명령 행 옵션"과 함께 (오류가 아닌) 경고가 표시되면 약화됩니다.

알고 계십니까? 어떻게 예방할 수 있습니까?

+1

downvoters 들어 : 왜 downvoted 의견을 추가 할 수 있습니까? 그런 다음 질문을 개선 할 수 있습니다. 방금 알아 봤지만 깃발 자체에 경고/오류가 표시되지 않는다는 것을 잊었습니다 – Flamefire

답변

1

인식 할 수없는 명령 줄 옵션에 대한 경고를 원하지 않는 경우 인식 할 수없는 명령 줄 옵션을 사용하지 마십시오. -Wno-c99-extensions은 유효한 GCC 옵션이 아닙니다. (나는 그것이 clangism이라고 생각합니다.) 빌드 명령에서 제거하십시오.

경고 "를 인식 할 수없는 명령 줄 옵션"에 대한 주어지지 : 다른이 존재하는 경고가있을 때 경고 만 방출 이유에 관해서는

이 문제는 반 직관적하지만 it is actually deliberate and documented 보인다 - foo는 -Wno

GCC 4.4 등과 같은 GCC 설명서에 설명 가입일 : 인식 할 수없는 경고 옵션이 요청 될 때 (-Wunknown-warning), GCC는 옵션이 인식되지 않는 없다는 진단 방출한다. 그러나 -Wno- 양식을 사용하면 동작이 약간 다릅니다. -Wno-unknown-warning에 대한 진단 정보는 다른 진단 정보가 생성되지 않는 한 생성되지 않습니다. 이렇게하면 이전 컴파일러에서 새로운 -Wno- 옵션을 사용할 수 있지만 잘못된 것이 있으면 컴파일러에서 인식 할 수없는 옵션이 있음을 경고합니다. (변경 내역은 PR28322 참조) -Wno-foo 옵션을 확인하는 구성 테스트가 중단 될 수 있습니다. 해결 방법은 양수형 (-Wfoo)을 테스트하거나 다른 경고를 유발하는 테스트 케이스를 사용하여 테스트하는 것입니다.

사실은 소프트웨어 개발자가 자신의 빌드 스크립트에 사소한 수정 사항을 구체적으로 CMake로,이 "문제"에 직면하고 만든 구글 메일 링리스트 스레드에 대한 몇 가지 결과를 "해결"할 수 있습니다.

+0

당신이 옳은 것처럼 보입니다. 특정 컴파일러를 확인하지 않으려면 CMAKE CHECK_CXX_COMPILER_FLAG를 사용합니다. 다른 오류가 없다면 경고/오류가 없다는 점을 질문에 추가하는 것을 잊어 버린 것 같습니다. 따라서 실제 질문은 : 경고가 없을 때 나는 아무것도 얻지 못하는 이유는 무엇입니까? (관련이없는) 경고가있을 때 추가적인 경고/오류가 생기는 이유는 무엇입니까? – Flamefire

+0

@ Flamefire : 누가 신경 쓰겠 니? 존재하지 않는 플래그를 사용 중입니다. 왜 그 행동에 대해 합리화하려고합니까? 단순히 사용을 중지하십시오. –

+1

CMake를 멀티 플랫폼/멀티 컴파일러 프로젝트에 사용할 때주의해야합니다. 물론 각 컴파일러를 확인하고 해당 컴파일러와 버전에 따라 플래그를 추가 할 수 있습니다. 그러나 이것은 매우 쉽게 커지고 오류가 발생하기 쉽습니다. 이는 CHECK_CXX_COMPILER_FLAG의 사용 사례 중 하나이지만 일관성없는 동작으로 인해 실패합니다. – Flamefire