xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
9.6k stars 765 forks source link

xmake的qt.widgetapp_static规则不支持qt6 #2791

Closed hybcloud closed 1 year ago

hybcloud commented 1 year ago

Xmake 版本

xmake v2.7.1+master.5c0e53f91

操作系统版本和架构

windows11 21H2 (22000.856)

描述问题

我用的版本是Qt6.3.1,静态编译的配置选择ZLIB这些库都用Qt内置版本,用xmake内建模板创建widgetapp工程,规则改为静态规则,无法正常构建。

期待的结果

更新静态编译规则,或者作者大大稍微指点一下,我来实现、调试、提PR

工程配置

xmake内建的模板已经不能正常工作了。 基于QtCreator的CMake输出的makefile,我改了xmake.lua文件,新文件长这样:

add_rules("mode.debug", "mode.release")

set_runtimes("MD")

target("qtwidget")
    add_rules("qt.widgetapp_static")
    add_headerfiles("src/*.h")
    add_files("src/*.cpp")
    add_files("src/mainwindow.ui")
    -- add files with Q_OBJECT meta (only for qt.moc)
    add_files("src/mainwindow.h")
    add_files({
        "C:/Qt/6.3.1/msvc2022_64_static/lib/objects-Debug/Widgets_resources_1/.rcc/qrc_qstyle.cpp.obj",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/objects-Debug/Widgets_resources_2/.rcc/qrc_qstyle1.cpp.obj",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/objects-Debug/Widgets_resources_3/.rcc/qrc_qmessagebox.cpp.obj",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/objects-Debug/QWindowsIntegrationPlugin_resources_1/.rcc/qrc_openglblacklists.cpp.obj",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/objects-Debug/QWindowsIntegrationPlugin_resources_2/.rcc/qrc_cursors.cpp.obj",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/objects-Debug/Gui_resources_1/.rcc/qrc_qpdf.cpp.obj"
    })
    add_links(
        "C:/Qt/6.3.1/msvc2022_64_static/plugins/styles/qwindowsvistastyle",
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qgif",
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qicns",
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qico",
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qjpeg", 
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/iconengines/qsvgicon",
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qsvg",  
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qtga",  
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qtiff",  
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qwbmp",  
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/imageformats/qwebp",  
        "C:/Qt/6.3.1/msvc2022_64_static/./plugins/platforms/qwindows",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6BundledLibjpeg",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6Svg",
        "uxtheme",
        "dwmapi",  
        "imm32",  
        "oleaut32",
        "shlwapi",
        "winspool",
        "wtsapi32",
        "shcore",
        "comdlg32",
        "d3d9",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6OpenGL",
        "d3d11",
        "dxgi",
        "dxguid",
        "gdi32",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6BundledHarfbuzz",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6BundledFreetype",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6BundledLibpng",
        "d2d1",
        "dwrite",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6BundledZLIB",
        "synchronization",
        "mpr",
        "userenv",
        "advapi32",
        "authz",
        "kernel32",  
        "netapi32",  
        "ole32",  
        "user32",  
        "uuid",  
        "version",
        "winmm",  
        "ws2_32",
        "runtimeobject",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6BundledPcre2",
        "C:/Qt/6.3.1/msvc2022_64_static/lib/Qt6EntryPoint",
        "shell32",
        "kernel32",
        "user32",
        "gdi32",
        "winspool",
        "shell32",
        "ole32",
        "oleaut32",
        "uuid",
        "comdlg32",
        "advapi32"
    )

另外,我在C:\Program Files\xmake\rules\qt\xmake.lua做了如下改动: image

此时能够正常进行6.3.1的静态编译

附加信息和错误日志

No response

waruqi commented 1 year ago

shared 版本呢,也不行?

plugin 可以用下面的方式配置 links

https://github.com/xmake-io/xmake/blob/f16528f0e60e1823fc1aa093e5cd38f8e3406ac9/tests/projects/qt/widgetapp_static/xmake.lua#L12

一些通用配置能改的,你可以先 pr 过来,比如 platform support

waruqi commented 1 year ago

我暂时没 qt 环境,@Leart-Loen @hybcloud 可以先找下,qt sdk 里面有没有 QtPlatform* 字样的其他库

waruqi commented 1 year ago

我暂时对 qt6 去掉这个库,可以先试试,我没测过

xmake update -s dev

worksoup commented 1 year ago

share版本似乎正常 qt sdk 里面没有其他 QtPlatform* 字样的库了 但是你改的有点过于仓促了😂 大于等于6.0包含在大于等于5.9里面,先判断大于等于5.9然后elseif大于等于6.0就执行不到了😂

waruqi commented 1 year ago

改了,再试试,还不行,你也可以直接来个 pr

worksoup commented 1 year ago

按照 @hybcloud 的 xmake.lua 搞了一下,Qt 版本 6.4.1 静态编译时指定了 -static-runtime ,然后加上了个 md4c 的依赖(空项目也依赖)。 现在确实可以成功编译了。 以下全文:

add_rules("mode.debug", "mode.release")

includes("qt_add_static_plugins.lua")

target("zuoye_clone")
    add_rules("qt.widgetapp_static")
    add_headerfiles("src/*.h")
    add_files("src/*.cpp")
    add_files("src/mainwindow.ui")
    add_files("src/pics.qrc")

    -- add files with Q_OBJECT meta (only for qt.moc)
    add_files("src/datawidget.h")
    add_files("src/mainwindow.h")

    add_files({
        "PATH/TO/Qt/6.4.1/static/lib/objects-Release/Widgets_resources_1/.rcc/qrc_qstyle.cpp.obj",
        "PATH/TO/Qt/6.4.1/static/lib/objects-Release/Widgets_resources_2/.rcc/qrc_qstyle1.cpp.obj",
        "PATH/TO/Qt/6.4.1/static/lib/objects-Release/Widgets_resources_3/.rcc/qrc_qmessagebox.cpp.obj",
        "PATH/TO/Qt/6.4.1/static/lib/objects-Release/QWindowsIntegrationPlugin_resources_1/.rcc/qrc_openglblacklists.cpp.obj",
        "PATH/TO/Qt/6.4.1/static/lib/objects-Release/QWindowsIntegrationPlugin_resources_2/.rcc/qrc_cursors.cpp.obj",
        "PATH/TO/Qt/6.4.1/static/lib/objects-Release/Gui_resources_1/.rcc/qrc_qpdf.cpp.obj"
    })
    add_links(
        "PATH/TO/Qt/6.4.1/static/plugins/styles/qwindowsvistastyle",
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qgif",
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qicns",
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qico",
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qjpeg", 
        "PATH/TO/Qt/6.4.1/static/plugins/iconengines/qsvgicon",
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qsvg",  
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qtga",  
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qtiff",  
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qwbmp",  
        "PATH/TO/Qt/6.4.1/static/plugins/imageformats/qwebp",  
        "PATH/TO/Qt/6.4.1/static/plugins/platforms/qwindows",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6BundledLibjpeg",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6Svg",
        "uxtheme",
        "dwmapi",  
        "imm32",  
        "oleaut32",
        "shlwapi",
        "winspool",
        "wtsapi32",
        "shcore",
        "comdlg32",
        "d3d9",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6OpenGL",
        "d3d11",
        "dxgi",
        "dxguid",
        "gdi32",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6BundledHarfbuzz",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6BundledFreetype",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6BundledLibpng",
        "d2d1",
        "dwrite",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6BundledZLIB",
        "synchronization",
        "mpr",
        "userenv",
        "advapi32",
        "authz",
        "kernel32",  
        "netapi32",  
        "ole32",  
        "user32",  
        "uuid",  
        "version",
        "winmm",  
        "ws2_32",
        "runtimeobject",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6BundledPcre2",
        "PATH/TO/Qt/6.4.1/static/lib/Qt6EntryPoint",
        "shell32",
        "kernel32",
        "user32",
        "gdi32",
        "winspool",
        "shell32",
        "ole32",
        "oleaut32",
        "uuid",
        "comdlg32",
        "advapi32",
        "PATH/TO/MD4C/lib/md4c",
        "PATH/TO/MD4C/lib/md4c-html"
    )

    -- add plugin: QSvgPlugin (optional)
    add_frameworks("QtSvg","QtSql")
    qt_add_static_plugins("QSvgPlugin", {linkdirs = "plugins/imageformats", links = {"qsvg"}})

还有就是想请教一下,之前编译的Qt static 我没有指定 -static-runtime ,所以在 xmake.lua 里设置了 set_runtimes("MD") ,但实际上编译的时候会提示 moc_mainwindow.cpp.obj (应该是这个文件):-1: error: LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(main.cpp.obj 中) 。 后来我又加上 -static-runtime 编译了一遍 Qt 就没问题了。 不知道是不是个bug。

waruqi commented 1 year ago

你的 qt sdk 是 MT 的,那就只能用 MT 。。得对上,跟 bug 无关