2010-07-22 28 views
21

Trong dự án phần mềm tôi đang làm việc, chúng tôi sử dụng một số thư viện của bên thứ ba, thật đáng buồn, tạo ra cảnh báo gcc gây phiền nhiễu. Chúng tôi đang nỗ lực để làm sạch tất cả các mã cảnh báo và muốn bật cờ cảnh báo-coi-lỗi (-Werror) trong GCC. Có cách nào để thực hiện cảnh báo do bên thứ ba này tạo ra mà chúng tôi không thể khắc phục, biến mất không?Cách loại bỏ cảnh báo lib/bên thứ ba bên ngoài trong GCC

+0

Phiên bản gcc nào? –

+0

Greg - cảm ơn, sẽ làm. Sam - g ++ 4.1.2 – Michael

Trả lời

14

Tôi đoán bạn đang nói về các cảnh báo đến từ tiêu đề thư viện của bên thứ ba.

Các giải pháp cụ thể GCC sẽ được tạo ra một tập tin tiêu đề wrapper trong đó có bản chất hai dòng:

#pragma GCC system_header 
#include "real_3rd_party_header.h" 

Và sử dụng các wrapper thay vì tiêu đề bên thứ 3 gốc.

Kiểm tra another SO response nêu chi tiết pragma. Về cơ bản nó nói với GCC rằng điều này (với các tệp được đệ quy) là một tiêu đề hệ thống, và không có thông điệp cảnh báo nào được tạo ra.

Nếu không, tôi không biết cách người ta có thể tắt cảnh báo đến từ mã của bên thứ ba. Ngoại trừ bởi sức mạnh vũ phu của khóa học: trong hệ thống xây dựng cấu hình các tập tin được xây dựng với cảnh báo tắt.

3

http://www.artima.com/cppsource/codestandards.html

Ví dụ 1: Một tập tin tiêu đề của bên thứ ba. Tệp tiêu đề thư viện mà bạn không thể thay đổi có thể chứa cấu trúc nguyên nhân (có thể là lành tính) cảnh báo. Sau đó, hãy quấn tệp bằng phiên bản của riêng bạn #includes tiêu đề gốc và chọn lọc chỉ cảnh báo ồn ào cho phạm vi đó, rồi #include wrapper trong suốt phần còn lại của dự án.

34

Sử dụng -isystem Ví dụ:

gcc -I./src/ -isystem /usr/include/boost/ -c file.c -o obj/file.o 

Với -isystem NO cảnh báo về tăng: D

+3

Đây là giải pháp tốt hơn nhiều so với việc tạo trình bao bọc. –

11

Nếu bạn đang sử dụng CMake, bạn có thể đạt được điều này bằng cách thêm SYSTEM để include_directories:

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

Tôi đã thử nghiệm điều này dưới GCC và nó hoạt động tốt, nhưng nó không làm bất cứ điều gì dưới MSVC. Không bất ngờ vì MSVC dường như không có bất kỳ cách nào để chỉ định thư mục tiêu đề hệ thống (nghĩa là hệ thống của GCC), nhưng cần lưu ý điều gì đó nếu bạn cần hỗ trợ MSVC. – Kevin

+0

Dường như không làm gì cho tôi trên Xcode/Clang. –

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