2010-08-04 5 views
5

저는 최근에 우리 코드에서 경고를 제거하고 GCC 경고 플래그 (예 : -Wall, -Wno-<warning to disable>, -fdiagnostics-show-option 등)에 익숙해졌습니다. 그러나 링커 경고를 비활성화 (또는 심지어 제어)하는 방법을 알아낼 수 없었습니다. 내가 얻고 있었다 가장 일반적인 링커 경고는 다음과 같은 형식으로되어 있습니다 내가 사용하던 라이브러리를 내 응용 프로그램이 hidden 가시성을 구축하면서 default 가시성을 사용하여 제작 되었기 때문에이 있었다 얻고 있었다어떻게 GCC 링커 경고를 억제합니까?

ld: warning: <some symbol> has different visibility (default) in 
<path/to/library.a> and (hidden) in <path/to/my/class.o> 

이유. 나는 도서관을 hidden 가시성으로 재건하여 이것을 고쳤습니다.

내 질문에도 불구하고 : 내가 원하는 경우 해당 경고를 어떻게 억제합니까? 그것은 내가 지금해야 할 일이 아닙니다. 어떻게 수정해야하는지 알았지 만, 당신이 어떻게 그 특별한 경고를 억제하는지에 대한 궁금증이 있습니다 - 또는 일반적인 링커 경고?

C/C++/링커 플래그 중 하나에 -fdiagnostics-show-option을 사용하면 해당 경고가 다른 컴파일러 경고와 어디에서 유래했는지는 알 수 없습니다.

+0

설명서 페이지에서 링커 경고를 끌 수있는 옵션이 없음을 말하지 않습니다. –

답변

0

불행히도 ld는 특정 옵션을 억제하는 본질적인 방법을 가지고 있지 않습니다. 내가 유용하다고 알게 된 한 가지는 -Wl,--warn-once을 g ++로 전달하여 중복 경고의 수를 제한하는 것입니다 (또는 --warn-once을 직접 ld에 전달할 수 있음).

4

사실 GCC 링커 경고는 연결하려는 바이너리 라이브러리의 특정 섹션에 저장되어 있기 때문에 비활성화 할 수 없습니다. (섹션가 호출됩니다 .gnu.warning 기호.)

당신은하지만 (이것은 libc의-symbols.h에서 추출)과 같이, 그것을 음소거 할 수 있습니다 :

없이 :

#include <sys/stat.h> 

int main() 
{ 
    lchmod("/path/to/whatever", 0666); 
    return 0; 
} 

을 제공합니다 :

$ gcc a.c 
/tmp/cc0TGjC8.o: in function « main »: 
a.c:(.text+0xf): WARNING: lchmod is not implemented and will always fail 

해제와 함께 :

#include <sys/stat.h> 

/* We want the .gnu.warning.SYMBOL section to be unallocated. */ 
#define __make_section_unallocated(section_string) \ 
    __asm__ (".section " section_string "\n\t.previous"); 

/* When a reference to SYMBOL is encountered, the linker will emit a 
    warning message MSG. */ 
#define silent_warning(symbol) \ 
    __make_section_unallocated (".gnu.warning." #symbol) 

silent_warning(lchmod) 

int main() 
{ 
    lchmod("/path/to/whatever", 0666); 
    return 0; 
} 

을 제공합니다

#include <sys/stat.h> 

#define __hide_section_warning(section_string) \ 
    __asm__ (".section " section_string "\n.string \"\rHello world!      \"\n\t.previous"); 

/* If you want to hide the linker's output */ 
#define hide_warning(symbol) \ 
    __hide_section_warning (".gnu.warning." #symbol) 


hide_warning(lchmod) 

int main() 
{ 
    lchmod("/path/to/whatever", 0666); 
    return 0; 
} 

이 제공 : 숨어으로

$ gcc a.c 
/tmp/cc195eKj.o: in function « main »: 
a.c:(.text+0xf): WARNING: 

$ gcc a.c 
/tmp/cc195eKj.o: in function « main »: 
Hello world! 

물론,이 경우, 하나 여러 공간이나 멋진 일부 광고에 의해 Hello world! 교체 계획.

관련 문제