Как подавить предупреждения GCC из заголовков библиотек?

126

У меня есть проект, в котором используются библиотеки log4cxx, boost и т. Д., Заголовки которых генерируют множество (повторяющихся) предупреждений. Есть ли способ подавить предупреждения из библиотек включает (например, #include <some-header.h>) или включает из определенных путей? Я хотел бы использовать -Wall и / или -Wextra как обычно в коде проекта, чтобы соответствующая информация не была скрыта. В настоящее время я использую grep для вывода make, но мне бы хотелось чего-нибудь получше.

ADSR
источник

Ответы:

127

Вы можете попробовать включить заголовки библиотеки, используя -isystemвместо -I. Это сделает их «системными заголовками», и GCC не будет сообщать о них предупреждения.

фита
источник
11
Если вы пытаетесь сделать это в XCode, вставьте -isystem путь в «другие флаги C ++» в «пользовательских флагах компилятора» в настройках целевой сборки.
Мэтт Паркинс,
3
Одним из потенциальных недостатков является то, что на некоторых платформах g ++ автоматически оборачивает любые системные заголовки extern "C", что приводит к странным ошибкам при связывании C, если вы #includeиспользуете заголовок C ++ в -isystemпути.
Тавиан Барнс,
1
+1 помог мне решить проблемы с раздражающими предупреждениями об ускорении stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom 01
3
Почему у него намного больше голосов, чем у собственного ответа ОП, который сказал то же самое 1,5 часа назад?
underscore_d
1
Для Xcode: Что делать, если в настройках целевой сборки не было пути к папке в «Других флагах C ++»? Может ли кто-нибудь уточнить эти решения?
Ossir
107

Для тех, кто использует CMake, вы можете изменить свои include_directoriesдирективы, включив в них символ, SYSTEMкоторый подавляет предупреждения о таких заголовках.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
Дрю Ноукс
источник
Что, если библиотека предоставляет ${LIBFOO_USE_FILE}переменную, которая будет использоваться с командой CMake include () ?
Waldyrious 07
2
Похоже, это почти решение моей проблемы. У меня есть 1.) двоичная цель, которая зависит от 2.) цель только заголовка, написанная мной, которая зависит от 3.) некоторых внешних библиотек. Я понятия не имею, как получать предупреждения только для 1 и 2. Есть идеи?
knedlsepp
2
Кажется, не работает. Я пробовал это с проектом, который использует, easylogging++и получаю такое же огромное количество предупреждений от, easylogging++.hдаже если папка, в которой он находится, была включена с SYSTEMопцией.
rbaleksandar 02
Большое спасибо за это. Это избавило меня от страниц и страниц предупреждений.
Svalorzen
1
Тот же комментарий, что и к принятому ответу: для меня это плохая практика.
Раффи
55

Вы можете использовать прагмы. Например:

// 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
andrewrjones
источник
3
Доступно только с GCC> = 4.6
Caduchon
1
Мне нравится способность прагм push / pop. Я помню что-то вроде java, доступного много лет назад, и разочарование / зависть к C / C ++. мне нравится, что это доступно вgcc
Trevor Boyd Smith
@TrevorBoydSmith MS clтоже годами обладает способностями ... Иногда gccнемного медленно адаптируется.
Алексис Вилке
29

Я нашел уловку. Ибо библиотека включает вместо -Idirиспользования -isystem dirв make-файле. Затем GCC обрабатывает повышение и т.д., поскольку система включает и игнорирует любые предупреждения от них.

ADSR
источник
Обратите внимание, что если вы используете предварительно скомпилированный заголовок, вам нужно добавить флаг при компиляции заголовка и кода.
user202729
9

#pragmaинструкции для компилятора. вы можете установить что-то перед #include и отключить после.

Вы также можете сделать это из командной строки .

Еще одна страница GCC, посвященная отключению предупреждений .

Я бы выбрал вариант использования # pragma в исходном коде, а затем предоставил обоснованную причину (в качестве комментария), почему вы отключаете предупреждения. Это означало бы рассуждения о файлах заголовков.

GCC подходит к этому, классифицируя типы предупреждений. Вы можете классифицировать их как предупреждения или игнорировать. Связанные ранее статьи покажут вам, какие предупреждения могут быть отключены.

Примечание: вы также можете массировать исходный код, чтобы предотвратить определенные предупреждения, используя атрибуты ; однако это очень сильно связывает вас с GCC.

Примечание 2: GCC также использует интерфейс pop / push, который используется в компиляторе Microsoft - Microsoft отключает предупреждения через этот интерфейс. Я предлагаю вам изучить это подробнее, поскольку я не знаю, возможно ли это вообще.

Хасан Сайед
источник
Я рассмотрел прагмы, но если я подавлю предупреждение перед включением заголовка, как мне вернуть его в предыдущее состояние после #include? Я хочу видеть все предупреждения для кода проекта (помогло мне уже несколько раз), но могу управлять из командной строки.
AdSR
4

Вы можете попробовать использовать предварительно скомпилированные заголовки . Предупреждения не исчезнут, но, по крайней мере, они не появятся в вашей основной компиляции.

Пабло Санта Крус
источник
1
На самом деле это может быть хорошей идеей. Сторонние включения не меняются каждый день.
AdSR
Именно. Хотя я не так часто использовал их в Linux, они довольно хорошо работают в Visual Studio.
Пабло Санта Крус
Нет, они все равно будут отображаться в компиляции, если вы не используете другой способ их подавления (например -isystem, но не забудьте использовать его как при компиляции заголовка, так и в коде)
user202729
2

Если вам нужно явно переопределить системный заголовок, вы ограничены прагмами. Вы можете проверить, какие из них вы используете, через make dependoutput.

Также см. Диагностику push-pop для gcc> = 4.6

supaflav
источник
1

Ставя следующие

#pragma GCC system_header

отключит предупреждения GCC для всего следующего кода в этом файле.

Евгений
источник
-9

Для этих предупреждений должны быть причины. Они будут вызваны либо ошибками в вашем коде, который использует библиотеку, либо ошибками в самом коде библиотеки. В первом случае исправьте свой код. Во втором случае либо прекратите использование библиотеки, либо, если это FOSS-код, исправьте его.


источник
+1 за хороший совет: D, но он спрашивает, как сделать что-то конкретное: D
Хасан Сайед
4
Некоторые предупреждения невозможно или очень сложно исправить, особенно в стороннем коде, особенно в таком коде, богатом метапрограммированием, как Boost.
ulidtko 04
3
Хуже того, что меня беспокоит, так это «объявление 'c' shadows членом 'this' [-Werror = shadow]» глубоко, глубоко в каком-то заголовке повышения. Это, конечно, не проблема, но из-за этого и других подобных проблем мне сложно найти экземпляры, которые реально затмевают нашу кодовую базу.
dmckee --- котенок экс-модератора