Important: Please read the Qt Code of Conduct -

Qt5 CMake AUTOMOC "bug" and Widget Collections (duplicate plugin symbols) [solved]

  • I've been puzzled for a couple of days while trying to port a custom widget consisting of two basic sub widgets to Qt5. I am using CMake as the building system and I discovered a subtle AUTOMOC bug in case of widget collections.

    In my case I had two basic widget plugins plus another plugin that combined both in a single interface to be exposed in a widget collection library.

    class SchedulingWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface {};

    class RoutingWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface {};

    class CombinedWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface {};

    and the overall widget collection:

    class SRViewers : public QObject, public QDesignerCustomWidgetCollectionInterface {};

    and all these files (plus all the other dependencies) were compiled with the following CMake rules, where ${srviewersplugin_SOURCES} included all the sources and ${srviewersplugin_HEADERS} all the headers (to be automocced) as follows:

    add_library(srviewersplugin ${srviewersplugin_SOURCES} ${srviewersplugin_FORMS_HEADERS} ${srviewersplugin_HEADERS} ${srviewersplugin_RESOURCES_RCC})
    target_link_libraries(srviewersplugin ${Boost_LIBRARIES} Qt5::Widgets Qt5::Designer Qt5::WebKit Qt5::WebKitWidgets Qt5::Core Qt5::Gui)

    In Qt5, AUTOMOC seems to call moc on each of the three basic widget plugins in isolation, resulting in duplicate plugin symbols:
    @Redefinition of 'qt_section_alignment_dummy'@
    plus a bunch of other symbols). The only option for me to switch off AUTOMOC and to use a qt5_wrap_cpp() cmake rule so to avoid duplicate symbols.

    Hope this will be helpful to someone else



Log in to reply