Skip to content

type ‘struct DFileDragServerPrivate’ violates the C++ One Definition Rule #224

Description

@daf0x

SUMMARY | 问题概要

In src/filedrag/dfiledragserver.cpp and src/private/dfiledragserver_p.h the same class, DFileDragServerPrivate, is defined twice in different ways. This violates the One Definition Rule and is not valid C++.

DTK and OS VERSIONS | DTK&系统版本信息

dtk6gui-6.0.28

Minimal Reproducible Case Code | 最小复现案例代码

Configure and compile the library with LTO: -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -flto

OBSERVED RESULT | 观察到的结果

[55/68] : && /usr/lib/distcc/bin/x86_64-pc-linux-gnu-g++ -fPIC -march=core2 -msse4.1 -mxsave --param=l1-cache-line-size=64 --param=l1-cache-size=32 --param=l2-cache-size=6144 -O2 -pipe -fno-semantic-interposition -mfpmath=sse     -flto           -Werror=odr     -Werror=lto-type-mismatch       -Werror=strict-aliasing         -fgcse-after-reload    -floop-interchange      -fpeel-loops    -fpredictive-commoning  -ftree-partial-pre      -floop-block   -fgraphite-identity -fPIC -Wall -Wextra -fopenmp -Ofast  -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,--as-needed -shared -Wl,-soname,libdtk6gui.so.6 -o src/libdtk6gui.so.6.0.28 src/CMakeFiles/dtk6gui.dir/dtk6gui_autogen/mocs_compilation.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/dplatforminterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/dplatformwindowinterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/xcb/dxcbplatforminterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/xcb/dxcbplatformwindowinterface.cpp.o src/CMakeFiles/dtk6gui.dir/wayland-treeland-personalization-manager-v1-protocol.c.o src/CMakeFiles/dtk6gui.dir/qwayland-treeland-personalization-manager-v1.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/dtreelandplatforminterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/dtreelandplatformwindowinterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/dtreelandwindowmanagerhelper.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/personalizationwaylandclientextension.cpp.o src/CMakeFiles/dtk6gui.dir/dbus/xeventmonitor_interface.cpp.o src/CMakeFiles/dtk6gui.dir/filedrag/dfiledrag.cpp.o src/CMakeFiles/dtk6gui.dir/filedrag/dfiledragclient.cpp.o src/CMakeFiles/dtk6gui.dir/filedrag/dfiledragserver.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dforeignwindow.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dguiapplicationhelper.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dnativesettings.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dpalette.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dplatformhandle.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dplatformtheme.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dregionmonitor.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dwindowgroupleader.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dwindowmanagerhelper.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddciicon.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddciiconpalette.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddciiconplayer.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddesktopservices_linux.cpp.o src/CMakeFiles/dtk6gui.dir/util/dfontmanager.cpp.o src/CMakeFiles/dtk6gui.dir/util/dicon.cpp.o src/CMakeFiles/dtk6gui.dir/util/dicontheme.cpp.o src/CMakeFiles/dtk6gui.dir/util/dimagehandler.cpp.o src/CMakeFiles/dtk6gui.dir/util/dimagehandlerlibs.cpp.o src/CMakeFiles/dtk6gui.dir/util/dsvgrenderer.cpp.o src/CMakeFiles/dtk6gui.dir/util/dtaskbarcontrol.cpp.o src/CMakeFiles/dtk6gui.dir/util/dthumbnailprovider.cpp.o src/CMakeFiles/dtk6gui.dir/util/private/dbuiltiniconengine.cpp.o src/CMakeFiles/dtk6gui.dir/util/private/dciiconengine.cpp.o src/CMakeFiles/dtk6gui.dir/util/private/diconproxyengine.cpp.o src/CMakeFiles/dtk6gui.dir/dtk6gui_autogen/J56SQPRNRA/qrc_deepin-theme-plugin-icons.cpp.o  /usr/lib64/libQt6Network.so.6.8.1  /usr/lib64/libdtk6core.so.6.0.28  /usr/lib64/libQt6Svg.so.6.8.1  /usr/lib64/libQt6Xml.so.6.8.1  /usr/lib64/libdtk6log.so.0.0.1  /usr/lib64/libxkbcommon.so  /usr/lib64/libQt6WaylandClient.so.6.8.1  /usr/lib64/libwayland-client.so  /usr/lib64/libwayland-cursor.so  /usr/lib64/libQt6Gui.so.6.8.1  /usr/lib64/libQt6DBus.so.6.8.1  /usr/lib64/libGLX.so  /usr/lib64/libOpenGL.so  /usr/lib64/libQt6Core.so.6.8.1 && :
FAILED: src/libdtk6gui.so.6.0.28
: && /usr/lib/distcc/bin/x86_64-pc-linux-gnu-g++ -fPIC -march=core2 -msse4.1 -mxsave --param=l1-cache-line-size=64 --param=l1-cache-size=32 --param=l2-cache-size=6144 -O2 -pipe -fno-semantic-interposition -mfpmath=sse    -flto            -Werror=odr     -Werror=lto-type-mismatch       -Werror=strict-aliasing         -fgcse-after-reload    -floop-interchange      -fpeel-loops    -fpredictive-commoning  -ftree-partial-pre      -floop-block  -fgraphite-identity -fPIC -Wall -Wextra -fopenmp -Ofast  -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,--as-needed -shared -Wl,-soname,libdtk6gui.so.6 -o src/libdtk6gui.so.6.0.28 src/CMakeFiles/dtk6gui.dir/dtk6gui_autogen/mocs_compilation.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/dplatforminterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/dplatformwindowinterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/xcb/dxcbplatforminterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/xcb/dxcbplatformwindowinterface.cpp.o src/CMakeFiles/dtk6gui.dir/wayland-treeland-personalization-manager-v1-protocol.c.o src/CMakeFiles/dtk6gui.dir/qwayland-treeland-personalization-manager-v1.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/dtreelandplatforminterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/dtreelandplatformwindowinterface.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/dtreelandwindowmanagerhelper.cpp.o src/CMakeFiles/dtk6gui.dir/plugins/platform/treeland/personalizationwaylandclientextension.cpp.o src/CMakeFiles/dtk6gui.dir/dbus/xeventmonitor_interface.cpp.o src/CMakeFiles/dtk6gui.dir/filedrag/dfiledrag.cpp.o src/CMakeFiles/dtk6gui.dir/filedrag/dfiledragclient.cpp.o src/CMakeFiles/dtk6gui.dir/filedrag/dfiledragserver.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dforeignwindow.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dguiapplicationhelper.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dnativesettings.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dpalette.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dplatformhandle.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dplatformtheme.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dregionmonitor.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dwindowgroupleader.cpp.o src/CMakeFiles/dtk6gui.dir/kernel/dwindowmanagerhelper.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddciicon.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddciiconpalette.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddciiconplayer.cpp.o src/CMakeFiles/dtk6gui.dir/util/ddesktopservices_linux.cpp.o src/CMakeFiles/dtk6gui.dir/util/dfontmanager.cpp.o src/CMakeFiles/dtk6gui.dir/util/dicon.cpp.o src/CMakeFiles/dtk6gui.dir/util/dicontheme.cpp.o src/CMakeFiles/dtk6gui.dir/util/dimagehandler.cpp.o src/CMakeFiles/dtk6gui.dir/util/dimagehandlerlibs.cpp.o src/CMakeFiles/dtk6gui.dir/util/dsvgrenderer.cpp.o src/CMakeFiles/dtk6gui.dir/util/dtaskbarcontrol.cpp.o src/CMakeFiles/dtk6gui.dir/util/dthumbnailprovider.cpp.o src/CMakeFiles/dtk6gui.dir/util/private/dbuiltiniconengine.cpp.o src/CMakeFiles/dtk6gui.dir/util/private/dciiconengine.cpp.o src/CMakeFiles/dtk6gui.dir/util/private/diconproxyengine.cpp.o src/CMakeFiles/dtk6gui.dir/dtk6gui_autogen/J56SQPRNRA/qrc_deepin-theme-plugin-icons.cpp.o  /usr/lib64/libQt6Network.so.6.8.1  /usr/lib64/libdtk6core.so.6.0.28  /usr/lib64/libQt6Svg.so.6.8.1  /usr/lib64/libQt6Xml.so.6.8.1  /usr/lib64/libdtk6log.so.0.0.1  /usr/lib64/libxkbcommon.so  /usr/lib64/libQt6WaylandClient.so.6.8.1  /usr/lib64/libwayland-client.so  /usr/lib64/libwayland-cursor.so  /usr/lib64/libQt6Gui.so.6.8.1  /usr/lib64/libQt6DBus.so.6.8.1  /usr/lib64/libGLX.so  /usr/lib64/libOpenGL.so  /usr/lib64/libQt6Core.so.6.8.1 && :
/var/tmp/portage/gui-libs/dtk6gui-6.0.28/work/dtk6gui-6.0.28/src/private/dfiledragserver_p.h:20:7: error: type ‘struct DFileDragServerPrivate’ violates the C++ One Definition Rule [-Werror=odr]
   20 | class DFileDragServerPrivate : public DCORE_NAMESPACE::DObjectPrivate
      |       ^
/var/tmp/portage/gui-libs/dtk6gui-6.0.28/work/dtk6gui-6.0.28/src/filedrag/dfiledragserver.cpp:27:7: note: a different type is defined in another translation unit
   27 | class DFileDragServerPrivate : public DCORE_NAMESPACE::DObjectPrivate
      |       ^
/var/tmp/portage/gui-libs/dtk6gui-6.0.28/work/dtk6gui-6.0.28/src/filedrag/dfiledragserver.cpp:37:41: note: the first difference of corresponding definitions is field ‘dbusif’
   37 |     QSharedPointer<DDndSourceInterface> dbusif;
      |                                         ^
/var/tmp/portage/gui-libs/dtk6gui-6.0.28/work/dtk6gui-6.0.28/src/filedrag/dfiledragserver.cpp:27:7: note: a type with different number of fields is defined in another translation unit
   27 | class DFileDragServerPrivate : public DCORE_NAMESPACE::DObjectPrivate
      |       ^
/var/tmp/portage/gui-libs/dtk6gui-6.0.28/work/dtk6gui-6.0.28/src/private/dfiledragserver_p.h:28:10: error: type of ‘writeMimeData’ does not match original declaration [-Werror=lto-type-mismatch]
   28 |     void writeMimeData(QMimeData *dest);
      |          ^
/var/tmp/portage/gui-libs/dtk6gui-6.0.28/work/dtk6gui-6.0.28/src/filedrag/dfiledragserver.cpp:171:6: note: ‘writeMimeData’ was previously declared here
  171 | void DFileDragServerPrivate::writeMimeData(QMimeData *dest)
      |      ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: x86_64-pc-linux-gnu-g++ returned 1 exit status
compilation terminated.
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
distcc[330] ERROR: compile (null) on localhost failed
ninja: build stopped: subcommand failed.

EXPECTED RESULT | 期望的结果

library should compile without errors

ADDITIONAL INFORMATION | 额外补充

This patch fixes compilation for this package, but I don't know yet if it will cause issues down the line:

--- dtk6gui-6.0.28/src/filedrag/dfiledragserver.cpp     2025-01-21 19:55:29.965896207 +0100
+++ dtk6gui-6.0.28/src/filedrag/dfiledragserver.cpp     2025-01-21 20:01:34.589023409 +0100
@@ -3,6 +3,7 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later

 #include "dfiledragserver.h"
+#include "private/dfiledragserver_p.h"
 #include "private/dfiledragcommon_p.h"

 #include <DObjectPrivate>
@@ -21,27 +22,6 @@

 class DDndSourceInterface;

-/*!
- @private
- */
-class DFileDragServerPrivate : public DCORE_NAMESPACE::DObjectPrivate
-{
-    QMap<QString, QVariant> data;
-    QUuid uuid;
-
-    explicit DFileDragServerPrivate(DFileDragServer *q);
-    ~DFileDragServerPrivate();
-
-    void writeMimeData(QMimeData *dest);
-
-    QSharedPointer<DDndSourceInterface> dbusif;
-    static QHash<QString, DFileDragServer*> servermap;
-    static QWeakPointer<DDndSourceInterface> dbusifinst;
-
-    D_DECLARE_PUBLIC(DFileDragServer)
-    friend class DDndSourceInterface;
-};
-
 QWeakPointer<DDndSourceInterface> DFileDragServerPrivate::dbusifinst;
 QHash<QString, DFileDragServer*> DFileDragServerPrivate::servermap;

--- dtk6gui-6.0.28/src/private/dfiledragserver_p.h      2025-01-21 19:55:29.965896207 +0100
+++ dtk6gui-6.0.28/src/private/dfiledragserver_p.h      2025-01-21 20:03:25.821924918 +0100
@@ -11,6 +11,7 @@

 #include <QMap>
 #include <QUuid>
+#include <QSharedPointer>

 DGUI_BEGIN_NAMESPACE

@@ -22,14 +23,14 @@
     QMap<QString, QVariant> data;
     QUuid uuid;

-    DFileDragServerPrivate(DFileDragServer *q);
+    explicit DFileDragServerPrivate(DFileDragServer *q);
     ~DFileDragServerPrivate();

     void writeMimeData(QMimeData *dest);

-    static DDndSourceInterface *dbusif;
-    static int refcnt;
+    QSharedPointer<DDndSourceInterface> dbusif;
     static QHash<QString, DFileDragServer*> servermap;
+    static QWeakPointer<DDndSourceInterface> dbusifinst;

     D_DECLARE_PUBLIC(DFileDragServer)
     friend class DDndSourceInterface;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions