为什么Qt的CONFIG标志rtti和rtti_off只由qmake处理Windows目标。



我正在做一个跨平台的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 中解决。

相关内容

最新更新