我正在做一个跨平台的Qt项目,最近使用了dynamic_cast
,它在Linux下运行良好。但是我们的 CI 无法编译带有错误消息的 Windows 代码:
error: ‘dynamic_cast’ not permitted with -fno-rtti
我发现在我们的项目中设置了CONFIG += rtti_off
。根据Qt文档rtti_off
意味着:
RTTI 支持已禁用。默认情况下,使用编译器默认值。
没有关于标志的平台特定行为的文章(或者至少我没有找到它(。
Qt的mkspecs给出的grep -ir rtti
:
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?
- 这在任何地方都有记录吗?
- 如果是,在哪里?
- 如果没有,为什么?
编辑
澄清一下:我在Windows下使用mingw32-gcc,在Linux下使用gcc。两个版本都能够使用标志-fno-rtti
停用RTTI。如果我使用目标平台win32-g++
运行 qmake,但不使用linux
运行,则此标志将集成到生成的 Makefile 中。因此,上面的问题。
这是 QTBUG-26595,已在 Qt 5.12.1 中解决。