Почему флаги CONFIG Qt rtti и rtti_off обрабатываются только qmake для цели Windows - PullRequest
0 голосов
/ 13 октября 2018

Я работаю над кроссплатформенным проектом Qt и недавно использовал dynamic_cast, который прекрасно работал под Linux.Но наш CI не смог скомпилировать код для Windows с сообщением об ошибке:

error: ‘dynamic_cast’ not permitted with -fno-rtti

Я обнаружил, что в нашем проекте было установлено CONFIG += rtti_off.Согласно документации Qt rtti_off означает:

Поддержка RTTI отключена.По умолчанию используется компилятор по умолчанию.

Ничего не написано о поведении флага для конкретной платформы (или, по крайней мере, я его не нашел).

grep -ir rtti inMkpecs из Qt дал:

features/win32/rtti.prf:CONFIG -= rtti_off
features/win32/rtti.prf:QMAKE_CFLAGS += $$QMAKE_CFLAGS_RTTI_ON
features/win32/rtti.prf:QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RTTI_ON
features/win32/rtti_off.prf:CONFIG -= rtti
features/win32/rtti_off.prf:QMAKE_CFLAGS += $$QMAKE_CFLAGS_RTTI_OFF
features/win32/rtti_off.prf:QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RTTI_OFF
common/g++-win32.conf:QMAKE_CXXFLAGS_RTTI_ON  = -frtti
common/g++-win32.conf:QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
common/winrt_winphone/qmake.conf:CONFIG                  = package_manifest $$CONFIG incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target rtti
common/winrt_winphone/qmake.conf:QMAKE_CXXFLAGS_RTTI_ON  = -GR
common/winrt_winphone/qmake.conf:QMAKE_CXXFLAGS_RTTI_OFF =
common/msvc-desktop.conf:QMAKE_CXXFLAGS_RTTI_ON  = -GR
common/msvc-desktop.conf:QMAKE_CXXFLAGS_RTTI_OFF =

Так что эти флаги явно проверены только для платформ Windows.

Мои вопросы

  • Почему это делается только для Windows?
  • Это где-нибудь задокументировано?
    • Если да, то где?
    • Если нет, то почему?

Редактировать

Чтобы уточнить: я используюmingw32-gcc под Windows и gcc под Linux.Обе версии имеют возможность деактивировать RTTI, используя флаг -fno-rtti.Этот флаг интегрируется в сгенерированный Makefile, если я запускаю qmake с целевой платформой win32-g++, но не с linux.Отсюда и вопросы выше.

...