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;
SUMMARY | 问题概要
In
src/filedrag/dfiledragserver.cppandsrc/private/dfiledragserver_p.hthe 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 -fltoOBSERVED RESULT | 观察到的结果
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: