-
-
Notifications
You must be signed in to change notification settings - Fork 784
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
windows平台下用qt静态编译生成的Widgets应用程序报错 #356
Comments
|
windows下你这版本太老,需要先安装一次master/dev版本,才支持update命令。你也可以到github releases上下载 xmake-dev.exe/xmake-master.exe来更新 不过我还没更新刚的修改到xmake-dev.exe,等晚上我更新下。。 |
嗯嗯 那关于编译完不能运行的问题 跟更新版本有关系吗 |
windows下我之前测过动态库版本是可以运行的,你这static qt sdk的运行不起来 我这暂时没环境测试验证 暂时不清楚原因,看着像是运行时候的某些plugin在path下没找到导致,可能是运行环境的问题 你qt那个是通过qtcreator 运行的,还是手动点击程序运行的?qtcreator运行有可能会自动加载一些path环境什么的,跟xmake run的不一致。。 xmake编译那个,你是xmake run运行的,还是手动点击运行的? 你可以都尝试手动点击程序运行试试 |
我之前生成的动态库可以运行过,但是现在生成的不行了。 都是手动点击程序运行
|
那就你用 qt 编译,把完整的 编译、链接参数命令 什么的,贴一下,然后把xmake -v 编译的完整参数命令也贴一下 我对比下,看看 缺哪些flags |
qt项目
xmake的编译参数
|
mac上使用静态编译的qt也出现 编译通过但是运行报错的情况
|
如果两个平台都有相同的问题,应该不是link的差异导致,可能是某些编译flags确实导致, 或者mainwindow.h 生成moc_mainwindow.cpp上,一些flags有差异。。 这块 我晚上或者明天细看下,你这也可以自己 对比下 跟qt的flags差别,自己通过 add_cxflags 追加尝试下。。 或者可以吧 qt生成的 moc_mainwindow.cpp 替换xmake生成的 moc_mainwindow.cpp 尝试编译试试,看看是不是moc生成的问题。。 再或者把你这mac下 static qt sdk的环境打包一份。。发我下。。我回头看看 |
qt编译的这个C:\Users\Administrator\AppData\Local\Temp\static.exe.14260.1656.jom里面的完整link参数能给我看下么? 还有mac下也不行,那mac下qt编译的完整参数能帖我看下么。。我对比下。。 目前我查了下,可能还是link的时候,xmake 没有吧qt plugin的库加进去,导致加载失败了。。所以我要对比下,qt编译的link参数。。 目前你提供的看不到qt的完整link参数,很多都在.jom文件里 |
关于这个问题的一些资料: https://codeday.me/bug/20171015/85121.html 里面最下面说到另外一种解决办法就是设置环境变量来禁用插件 |
https://forum.qt.io/topic/90293/could-not-find-or-load-the-qt-platform-plugin-windows-in/8 这里有对windows上你这个问题的解决方式
这人就是通过移除所有插件相关path环境变量来解决的。
|
http://www.voidcn.com/article/p-flhmawej-bcy.html 这里是另一个解决方式,是吧qt相关插件目录放到exe执行目录下,让其找到来解决。。 所以我现在怀疑,应该不是编译的问题,还是运行的环境问题,mac下说不定可以通过编译的时候加上额外的rpathdir来让其找到,但是Windows可能还是要自己看看,当前环境或者当前目录,exe能否找到相关插件目录,感觉跟xmake编译关系不大 |
|
因为你现在用的是static qt sdk,静态链接进去了,是看不到的。。 你可以先试下我之前贴的网上的解决方式,看看能否解决问题,不行的话,等用mac 版本 qt编译给下详细 编译链接参数给我。。 或者吧你这的mac qt sdk 打包发我下,我试试 |
mac下用qt编译
|
我看了下,你这qt mac生成的是 static.app,能否把这整个app发我下。我觉得这个可能还是部署问题。。 qt生成的是xxx.app,我得确认下,qt是否吧 qt plugins 等依赖的库,都给部署copy到xxx.app进去了,所以直接运行xxx.app就成功了 这个里面有说明。 还有你只都是直接手动运行的 binary程序,还是点击运行的qt 生成的xxx.app程序? |
|
qmake会去自动生成一个类似 xxxx_plugin_import.cpp的文件,里面类似: #include <QtPlugin>
Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)
Q_IMPORT_PLUGIN(QXcbEglIntegrationPlugin)
Q_IMPORT_PLUGIN(QXcbGlxIntegrationPlugin)
Q_IMPORT_PLUGIN(QGifPlugin)
Q_IMPORT_PLUGIN(QICNSPlugin)
Q_IMPORT_PLUGIN(QICOPlugin)
Q_IMPORT_PLUGIN(QJpegPlugin)
Q_IMPORT_PLUGIN(QTgaPlugin)
Q_IMPORT_PLUGIN(QTiffPlugin)
Q_IMPORT_PLUGIN(QWbmpPlugin)
Q_IMPORT_PLUGIN(QWebpPlugin)
Q_IMPORT_PLUGIN(QEglFSKmsEglDeviceIntegrationPlugin)
Q_IMPORT_PLUGIN(QEglFSX11IntegrationPlugin) 然后编译的时候,指定link上对应的plugins,来实现静态链接plugins 你这的编译信息里面,有了这个
static_plugin_import.cpp 可以给我看下,我再分析看看 |
或者你这的qt demo工程可以发我看下 |
就是这个原因,我手动加了个 plugin_import.cpp #include <QtPlugin>
Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin) 然后links上对应的plugins库 libqcocoa.a 以及它的一些依赖库,就可以运行起来了。。 我现在需要确认下,这个文件,是qt工程会自动创建出来一直在工程里面维护的,还是只是qmake临时创建编译的。。 所以请提供一下你这qt的demo工程。我好分析下,如果去更好的处理这个问题。。 虽然原因找到了,但我需要花点时间想想怎么处理的更完善些。。 |
mac static qt sdk版本,我这已经支持了,不过需要改下xmake.lua去支持静态sdk编译,因为静态版本需要导入一些必须的plugin模块才能加载成功。。 -- add modes: debug and release
add_rules("mode.debug", "mode.release")
-- includes
includes("qt_add_static_plugins.lua")
-- add target
target("qt_demo")
-- add rules
add_rules("qt.application")
-- add headers
add_headerfiles("src/*.h")
-- add files
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 frameworks
add_frameworks("QtWidgets")
-- add plugin: QXXXIntegrationPlugin
if is_plat("macosx") then
qt_add_static_plugins("QCocoaIntegrationPlugin", {linkdirs = "plugins/platforms", links = {"qcocoa", "Qt5PrintSupport", "Qt5PlatformSupport", "cups"}})
elseif is_plat("windows") then
qt_add_static_plugins("QWindowsIntegrationPlugin", {linkdirs = "plugins/platforms", links = {"Qt5PrintSupport", "Qt5PlatformSupport", "cups"}})
end
-- add plugin: QSvgPlugin (optional)
qt_add_static_plugins("QSvgPlugin", {linkdirs = "plugins/imageformats", links = {"qsvg", "Qt5Svg"}}) widgetapp/quickapp的静态链接都支持了,你可以参考下example工程: qt_add_static_plugins函数是内置的辅助函数,用来添加导入静态qt插件的,如果你的qt工程用到了其他插件,也可以通过这个接口导入并且链接进来,只在静态sdk的时候需要。。 目前这个只在macos static qt sdk测试过, win 上可以参考这,你自己处理下 插件名和链接库: qt_add_static_plugins("QWindowsIntegrationPlugin", {linkdirs = "plugins/platforms", links = {"Qt5PrintSupport", "Qt5PlatformSupport", "cups"}}) 我还没测试过,可能会缺一些库,你自己补下吧,或者吧win sdk也打包发我看下。。 linux也是如此,可以自己加一下,或者打包给我看下。。 另外dev版本对静态库做了一些其他改进,一些qt需要的静态依赖库,我都内置link进去了,例如:qtpng 等。。 |
windows平台上xmake.lua修改后编译运行成功
|
windows的这些qt sys links 我内置进去了。。user32这些 |
The text was updated successfully, but these errors were encountered: