Есть ли возможность передавать включаемые через -isystem при использовании qmake - PullRequest
9 голосов
/ 17 ноября 2010

Я использую qmake в качестве сборщика make-файлов и хочу придерживаться его. Далее я хотел бы использовать «gcc -Wall -Werror -Wundef -Wextra» для получения надежного кода. Я думаю о "-педантике", но это еще не все. На данный момент моей главной проблемой являются тонны предупреждений, генерируемых такими библиотеками, как boost, части qt и тому подобное.

В настоящее время я использую прагмы всякий раз, когда включаю заголовки, генерирующие предупреждения

    #pragma GCC diagnostic ignored "-Wall"
    #include <QtGui>
    ...
    #include <QWidget>
    #pragma GCC diagnostic error "-Wall"

Это далеко не мило, довольно утомительно и обременительно, тем более что другие программисты тоже должны это делать. Есть ли опция, использующая qmake, которая позволяет включать qt-библиотеки в качестве системных заголовков, таким образом подавляя их предупреждения. Для простых make-файлов и cmake я знаю -isystem, но не могу найти для этого подвеску qmake.

Ответы [ 5 ]

9 голосов
/ 22 июня 2011

Самый простой способ, который я нашел, - это напрямую через QMAKE_CXXFLAGS. например для Boost это выглядит следующим образом в файле проекта

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0
3 голосов
/ 02 мая 2013

Я только что добавил это в мой macx-clang / qmake.conf:

QMAKE_CXXFLAGS += $$join(QMAKE_INCDIR_QT, " -isystem", "-isystem")

теперь работает хорошо.

1 голос
/ 28 апреля 2011

Поскольку многие настройки жестко закодированы в спецификации файлов, я думаю, вам нужно создать свои собственные.Начните с чтения mkspecs / linux-g ++ / qmake.conf или mkspecs / win32-g ++ / qmake.conf

. Вы увидите, что по умолчанию CONFIG использует настройку warn_on.и в mkspecs / common / g ++ у вас есть

QMAKE_CFLAGS_WARN_ON    += -Wall -W
QMAKE_CFLAGS_WARN_OFF   += -w
QMAKE_CXXFLAGS_WARN_ON  += $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF

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

CONFIG += warn_on
QMAKE_CFLAGS_WARN_ON    = -Wall -Werror -Wundef -Wextra -pedantic
QMAKE_CXXFLAGS_WARN_ON  = $$QMAKE_CFLAGS_WARN_ON

qt include path жестко закодирован в mkspecs / features / qt.prf как

#handle includes
INCLUDEPATH = $$QMAKE_INCDIR_QT $$INCLUDEPATH #prepending prevents us from picking up "stale" includes

Вы не хотите, чтобы QMAKE_INCDIR_QT был частью INCLUDEPATH, поскольку его компоненты объединены с -I.Вы хотите расширить его как $$ join (QMAKE_INCDIR_QT, "-isystem", "-isystem") где-нибудь еще ...

0 голосов
/ 07 сентября 2015

Придумал обходной путь: вручную изменив Makefile.

Добавить эту строку в .pro файл

system(./suppress_system_warnings.sh)

А затем создайте исполняемый файл suppress_system_warnings.sh

#!/bin/bash
run_in_background() {
    pidof qmake > /dev/null
    while [ $? -eq 0 ]
    do
        sleep 0.2
        pidof qmake > /dev/null
    done

    file=Makefile
    new_line=$( grep ^INCPATH $file | sed 's:-I\/:-isystem\/:g' | sed  's:-I\$:-isystem\$:' )
    line_num=$( grep -n ^INCPATH $file | cut -d':' -f1 )

    head -n $(expr $line_num - 1) $file > __tmp
    echo $new_line >> __tmp
    tail -n +$(expr $line_num + 1) $file >> __tmp

    mv __tmp $file
    exit 0; 
}

run_in_background &
exit 0;
0 голосов
/ 31 мая 2014

Обратите внимание, что правильный ответ на этот вопрос - использовать ключевое слово SYSTEM в макросе include_target ():

include_directories(SYSTEM ${QT_INCLUDES})

Это работает для многих библиотек, а не только для Qt, который я мог бы использовать без особых проблем,Но Magic ++. H - действительно ужасная работа по сравнению, и мне нужно было иметь эту возможность.

Вы можете найти больше информации по этому вопросу:

Вместо этого используйте -isystem-я с CMake

...