2010-08-04 27 views
5

Gần đây tôi đã có một cuộc thập tự chinh để loại bỏ cảnh báo khỏi mã của chúng tôi và trở nên quen thuộc với cờ cảnh báo GCC (chẳng hạn như -Wall, -Wno-<warning to disable>, -fdiagnostics-show-option, v.v.). Tuy nhiên tôi đã không thể tìm ra cách để vô hiệu hóa (hoặc thậm chí kiểm soát) cảnh báo mối liên kết. Cảnh báo mối liên kết phổ biến nhất mà tôi đã nhận được có dạng sau:Làm cách nào để ngăn chặn cảnh báo liên kết GCC?

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

Lý do tôi đã nhận được điều này là do thư viện tôi đã sử dụng được xây dựng sử dụng khả năng hiển thị default trong khi ứng dụng của tôi được xây dựng với hidden tầm nhìn. Tôi đã sửa lỗi này bằng cách xây dựng lại thư viện với mức hiển thị hidden.

Câu hỏi của tôi là: làm thế nào tôi có thể ngăn chặn cảnh báo đó nếu tôi muốn? Nó không phải cái gì mà tôi cần phải làm bây giờ mà tôi đã tìm ra cách để sửa chữa nó nhưng tôi vẫn tò mò như thế nào bạn sẽ ngăn chặn cảnh báo cụ thể đó - hoặc bất kỳ cảnh báo liên kết nói chung?

Sử dụng -fdiagnostics-show-option cho bất kỳ cờ C/C++/linker nào không nói cảnh báo đến từ đâu cùng với cảnh báo trình biên dịch khác.

+0

trang người dùng cho ld không cho biết có bất kỳ tùy chọn nào để tắt cảnh báo liên kết: ( –

Trả lời

0

Thật không may ld dường như không có cách nào nội tại để ngăn chặn các tùy chọn cụ thể. Một điều tôi thấy hữu ích là giới hạn số lượng cảnh báo trùng lặp bằng cách chuyển -Wl,--warn-once tới g ++ (hoặc bạn có thể chuyển trực tiếp --warn-once trực tiếp tới ld).

4

Thực ra, bạn không thể tắt cảnh báo trình liên kết GCC, vì nó được lưu trữ trong một phần cụ thể của thư viện nhị phân mà bạn đang liên kết. (Phần được gọi .gnu.warning biểu tượng.)

Bạn tuy nhiên có thể tắt nó, như thế này (điều này được chiết xuất từ ​​libc-symbols.h):

Nếu không có nó:

#include <sys/stat.h> 

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

Cung cấp:

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

Với việc vô hiệu hóa:

#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; 
} 

cho:

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

Với ẩn:

#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; 
} 

cho:

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

Rõ ràng, trong trường hợp đó, hãy thay Hello world! hoặc bởi nhiều không gian hoặc một số quảng cáo cho tuyệt vời của bạn dự án.

Các vấn đề liên quan