Откуда берутся флаги компилятора при использовании qmake? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть проект qmake, в котором я не могу отлаживать, потому что что-то добавляет -O2 -g к концу флагов компилятора в режиме отладки, переопределяя все мои флаги отладки и оптимизации. Я записал весь проект на -O2, а его нет (я удалил тот, который у меня был для релиза). Удаление папки сборки и повторный запуск qmake не помогли. Я пытаюсь отследить, что добавляет флаги компилятора, но мне чего-то не хватает.

Известные вещи, которые могут добавлять флаги компилятора:

  • QMAKE_CXXFLAGS - Добавляет флаги как указано во всех сборках.
  • QMAKE_CXXFLAGS_DEBUG - добавляет флаги, как указано в отладочных сборках.
  • QMAKE_CXXFLAGS_RELEASE - добавляет флаги, как указано в сборках выпуска.
  • CONFIG - Добавляет флаги, которые сложно отследить. CONFIG += strict_c++ и CONFIG += c++17 не удалось перезаписать мои -std=c++17, но я не могу сказать, какие еще флаги добавляются. Также вызов qmake содержит CONFIG+=debug, который может добавлять или не добавлять другие флаги. Я не могу отличить от документации .
  • mkspec - В проектах -> build он перечисляет эффективный вызов qmake, который включает в себя, например, -spec linux-g++, который, я думаю, включает /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf который включает в себя больше файлов, которые добавляют зависимые от платформы флаги. Снятие флага spe c не привело к удалению нежелательного флага -O2. Также это работает для других проектов, так что, вероятно, это не преступник.
  • TEMPLATE - Указывает, как организован проект. Обычно это просто APP, но в этом используется subdirs, который может переопределять флаги, поскольку все подпроекты должны иметь одинаковые флаги.

В идеальном ответе перечислены все способы добавления флагов компилятора, в каком порядке они добавлены, объяснение, как проверить, какие флаги они добавляют и как их изменить.

1 Ответ

0 голосов
/ 06 апреля 2020

То, что делает qmake, просто создает make-файл. Сгенерированный Makefile использует только флаги компилятора из CXXFLAGS (плюс DEFINES) и INCPATH make-переменных, если у вас нет некоторых правил, созданных вручную. Это ясно видно из сгенерированного make-файла.

И эти переменные make происходят непосредственно из qmake vars, таких как QMAKE_CXXFLAGS, DEFINES и INCLUDEPATH. (Это делается внутренне в исходном коде qmake; ну, на самом деле, на некоторых платформах все может быть сложнее, поэтому обратитесь также к исходному коду qmake).

Теперь QMAKE_CXXFLAGS - это просто переменная qmake. Таким образом, в принципе, он может быть изменен в любой строке любого скрипта qmake. Учитывая, что эти скрипты зависят от ОС / архива / компилятора / опций сборки Qt / опций приложения и т. Д. c. Ваши ожидания «идеального ответа» слишком сильно растянуты.

Но, грубо говоря, qmake использует свои сценарии в следующем порядке (подсказка: смотрите полный список зависимостей в сгенерированном make-файле):

features/spec_pre.prf
<QMAKE-SPEC>/qmake.conf (usually includes features/qt_config.prf and a ton of Qt-related stuff)
features/spec_post.prf
features/default_pre.prf
<user project>
features/default_post.prf
all features/xxx.prf according to the final CONFIG value (note: order reversed!)

Так что, если вы пропустите какой-либо флаг в своем проекте, он, вероятно, происходит либо от default_post.prf (например, флаги выпуска для сборки выпуска), либо от CONFIG (то есть features/xxx.prf).

...