神末shenmo
deepin
an hour ago Spark-App
Q&A Team
卧槽,你花了多少token做的这玩意
这跟长征一样
Reply Like 0 View the author
卧槽,你花了多少token做的这玩意
这跟长征一样
卧槽,你花了多少token做的这玩意
这跟长征一样
具体花了多少我不知道 差不多整整4天时间吧
按之前一天2-3亿的消耗来看 估计10-20亿
Popular Ranking
ChangePopular Events
More
deepin-music Windows (MSYS2 UCRT64) 移植编译指南
1. 环境准备
1.1 安装 MSYS2
从 msys2.org 下载安装 MSYS2。
1.2 打开 UCRT64 终端
启动 UCRT64 终端 (
ucrt64.exe),不要使用 MSYS Shell (msys2.exe)。ucrt64.exemingw64.exemsys2.exe1.3 安装编译工具链
1.4 安装依赖包
2. 编译顺序
依赖链如下,必须严格按顺序编译:
3. 编译步骤
所有项目统一安装到 UCRT64 的
/ucrt64目录下。3.1 编译 dtkcommon
无外部依赖,纯 cmake 配置安装。
3.2 编译 dtklog
依赖 Qt6 Core、spdlog。需要禁用 systemd。
3.3 编译 dtk6core
依赖 dtkcommon、dtklog、Qt6 Core/Xml/DBus、ICU、uchardet。
3.4 编译 dtk6gui
依赖 dtk6core、Qt6 Gui/DBus/Network。禁用 librsvg、libxdg、freeimage、libraw。
3.5 编译 dtk6widget
依赖 dtk6gui、dtk6core、Qt6 Widgets/DBus/PrintSupport/Svg。
3.6 编译 dtk6declarative
依赖 dtk6gui、Qt6 Quick/QuickControls2/DBus。
3.7 编译 deepin-music
依赖以上全部 + VLC、taglib、ffmpeg、SDL2。
4. 一键编译脚本
将以下内容保存为
build-all.sh,在 UCRT64 终端中执行:5. 发布部署
编译完成后,使用 PowerShell 脚本部署。
5.1 首次完整部署 —
deploy.ps1首次部署或依赖变化时执行。自动从 ucrt64 解析并复制所有 DLL 依赖。将以下内容保存为
deepin-music/deploy.ps1:5.2 增量快速部署 —
deploy-fast.ps1仅修改 deepin-music 代码重新编译后执行。只更新 exe、DLL 和翻译,跳过所有依赖和插件。将以下内容保存为
deepin-music/deploy-fast.ps1:注意:
deploy-fast.ps1依赖之前已执行过deploy.ps1。如果 deploy 目录不存在或缺少依赖 DLL,需要先执行完整部署。6. 常见问题
Q:
error: target not found: mingw-w64-ucrt-x86_64-base-develbase-devel是 MSYS2 自身的工具链包组,属于msys仓库,不带mingw-w64-ucrt-x86_64-前缀:Q: cmake 找不到 Qt6
确保在 UCRT64 终端中执行,且设置了环境变量:
Q: VLC DLL 文件名不确定
查看实际安装的文件名:
根据实际文件名修改
dynamiclibraries.cpp中的常量。Q: 设置无法保存
DTK 的
QSettingBackend在 worker 线程异步写入 config.ini,在 Windows 上不可靠。MusicSettings已改为直接用QSettings读写,绕过 DTK backend。如果遇到设置丢失,删除AppData/Local/deepin/deepin-music/config.ini重启应用。7. UCRT64 中无法安装的包
mpris-qt6#ifdef Q_OS_LINUX条件编译librsvg-2.0-DDTK_DISABLE_LIBRSVG=ON+dsvgrenderer.cpp整体条件化libstartup-notificationstartupnotificationmonitor.cpp提供 Windows stubxcb-util/xext/xi/x11if(LINUX)条件化gsettings-qtlibcups2-dev#ifdef Q_OS_LINUX条件化8. 效果预览
9. 各仓库代码修改详解
8.1 dtkcore(8 文件,+87/-25)
src/CMakeLists.txt— D-Bus/Qt6 CorePrivate/iconv 链接条件化为什么改:原代码无条件
find_package(DBus1 REQUIRED)和target_link_libraries(... dbus-1),Windows 上没有 libdbus-1。同时 Windows 缺少CorePrivate模块和iconv库。怎么改:
src/dconfig.cpp— DConfig 日志类别条件编译为什么改:
D_DISABLE_DCONFIG宏在 Windows 上已定义(见 dtkgui.cmake),Q_DECLARE_LOGGING_CATEGORY需要对应条件化。怎么改:
src/dsgapplication.cpp— D-Bus ApplicationManager 整体条件化为什么改:
、、等 Linux 头文件在 Windows 上不存在;D-Bus ApplicationManager 仅 Linux 可用。怎么改:
src/dsysinfo.cpp— Windows 头文件src/filesystem/dstandardpaths.cpp— POSIX 函数条件化为什么改:
、、getuid()、getpwuid()在 Windows 上不存在。怎么改:
src/log/LogManager.cpp— JournalAppender/systemd 条件化为什么改:
JournalAppender和 systemd 检测仅 Linux 可用。tools/CMakeLists.txt— Linux 专有工具条件化8.2 dtkgui(13 文件,+170/-39)
dtkgui.cmake— librsvg/DConfig/MGW 导出/tools 条件化为什么改:librsvg 在 MSYS2 无包;DConfig 仅 Linux 可用;MinGW 缺少 DLL 导出宏。
include/global/dtkgui_global.h— DLL 导出宏为什么改:MinGW 上类缺少导出宏会导致链接错误,需显式定义
LIBDTKGUISHARED_EXPORT。include/kernel/dpalette.h/include/util/ddciiconpalette.h— 导出宏修正怎么改:
Q_GUI_EXPORT改为无导出或LIBDTKGUISHARED_EXPORT,避免 MinGW 上的 dllimport 冲突。src/CMakeLists.txt— WaylandClient 移除/MGW 导出为什么改:WaylandClient 在 Windows 上不存在;MinGW 需要
--export-all-symbols。src/kernel/dguiapplicationhelper.cpp— DConfig 条件化为什么改:DConfig 在 Windows 上不可用,所有
_d_dconfig->调用需要空指针保护。src/kernel/dwindowmanagerhelper.cpp— XCB 条件化src/plugins/dplatformwindowinterface.cpp— Windows 窗口接口 stub为什么改:原代码所有方法返回空值/false,Windows 上需要真实的窗口行为。
src/plugins/plugins.cmake— XCB/Treeland 条件化src/private/dplatforminterface_p.h/dplatformwindowinterface_p.h怎么改:移除
LIBDTKGUISHARED_EXPORT(内部类无需导出);添加setWindowBlurArea虚方法和m_enableBlurWindow成员。src/util/dicontheme.cpp— QRC 资源路径支持为什么改:Windows 上 DCI 图标通过 QRC 资源加载(
":/..."),原代码只处理文件系统路径。src/util/dsvgrenderer.cpp— 整个文件条件化为什么改:librsvg 在 MSYS2 无包,SVG 渲染在 Windows 上由 Qt 自己处理。
8.3 dtkwidget(8 文件,+178/-43)
dtkwidget.cmake— MGW 导出/Svg 依赖src/CMakeLists.txt— X11/XCB 条件化为什么改:xcb-util、libstartup-notification、xext、xi、x11 在 MSYS2 无包。
src/widgets/dimageviewer.cpp— SVG 渲染 + abs() 类型修复为什么改:
DSvgRenderer::toImage()在 Windows 上不可用(librsvg 缺失);abs()在 MinGW 上返回int导致qFuzzyCompare类型不匹配。src/widgets/dprintpreviewdialog.cpp/dprintpreviewwidget.cpp— CUPS 条件化为什么改:libcups2-dev 在 MSYS2 无包,CUPS 打印仅 Linux 可用。
src/widgets/private/keyboardmonitor/dkeyboardmonitor.h/.cpp— X11 stub为什么改:键盘监控依赖 X11/Xcb,在 Windows 上需要 stub 实现。
src/widgets/private/startupnotifications/startupnotificationmonitor.cpp— X11 stub为什么改:启动通知监控依赖 XCB 和 libsn,在 Windows 上需要 stub。
8.4 dtkdeclarative(13 文件,+174/-60)
CMakeLists.txt— DBus/MGW 导出examples/exhibition/CMakeLists.txt— 链接器标志为什么改:
-z relro等 GNU ld 选项在 MinGW 上不适用。qt6/src/qml/AboutDialog.qml— Windows 图标 fallback为什么改:DCI 图标主题在 Windows 上可能不包含应用图标,需要 SVG 回退。
qt6/src/qml/TitleBar.qml— 窗口拖拽为什么改:Windows 无边框窗口需要 DragHandler 实现标题栏拖拽。
src/dquickwindow.cpp— Windows 无边框窗口/系统移动为什么改:Windows 上
FramelessWindowHint需要在原生窗口创建后设置;需要startSystemMove()方法支持标题栏拖拽。src/private/dqmlglobalobject.cpp— 网站信息条件化为什么改:
DSysInfo::distributionOrgWebsite()仅 Linux 可用。src/private/dquickbehindwindowblur.cpp— OpenGL 空指针保护为什么改:Windows 上 OpenGL context 可能为空导致崩溃。
src/private/dquickdciiconimage.cpp— DCI 图标 fallback为什么改:Windows 上 DCI 图标可能不在主题搜索路径中,需要直接文件查找。
src/qml/TitleBar.qml— 鼠标拖拽8.5 deepin-music(23 文件,+404/-58)
src/libdmusic/CMakeLists.txt— VLC 路径/MPRIS/导出为什么改:VLC 头文件路径硬编码为
/usr/include/vlc;mpris-qt6 仅 Linux 可用;MinGW 需要导出符号。src/libdmusic/core/audioanalysis.cpp— TagLib 路径安全为什么改:Windows 上 TagLib 需要宽字符路径
toStdWString();歌词路径检查需统一使用/分隔符。