Я работаю над кроссплатформенным проектом 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
.Отсюда и вопросы выше.