如何在macOS上使用QML构建应用?Qt5.15.2打包出现otool解析错误如何解决
macOS QML应用构建otool输出解析错误解决
错误日志
构建时抛出如下错误:
Could not parse otool output: "/Users/test/qt/dev/projects/TestProject/build-rproxychecker2-Desktop_Qt_5_15_2_clang_64bit-Debug/debug/ch2.app/Contents/Resources/qml/QtQml/Models.2/libmodelsplugin.dylib.dSYM/Contents/Resources/DWARF/libmodelsplugin.dylib: " Could not parse otool output: "/Users/test/qt/dev/projects/TestProject/build-rproxychecker2-Desktop_Qt_5_15_2_clang_64bit-Debug/debug/ch2.app/Contents/Resources/qml/QtQml/StateMachine/libqtqmlstatemachine.dylib.dSYM/Contents/Resources/DWARF/libqtqmlstatemachine.dylib: " Could not parse otool output: "/Users/test/qt/dev/projects/TestProject/build-rproxychecker2-Desktop_Qt_5_15_2_clang_64bit-Debug/debug/ch2.app/Contents/Resources/qml/QtQml/StateMachine/libqtqmlstatemachine.dylib.dSYM/Contents/Resources/DWARF/libqtqmlremoteobjects.dylib: " Could not parse otool output: "/Users/test/qt/dev/projects/TestProject/build-rproxychecker2-Desktop_Qt_5_15_2_clang_64bit-Debug/debug/ch2.app/Contents/Resources/qml/QtQml/StateMachine/libqtqmlstatemachine.dylib.dSYM/Contents/Resources/DWARF/libqmlplugin.dylib: " ... "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool: string table not at the end of the file (can't be processed) in file:/Users/test/qt/dev/projects/TestProject/buildrproxychecker2Desktop_Qt_5_15_2_clang_64bitDebug/debug/ch2.app/Contents/Resources/qml/QtQml/Models.2/libmodelsplugin.dylib.dSYM/Contents/Resources/DWARF/libmodelsplugin.dylib " "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool: string table not at the end of the file (can't be processed) in file:/Users/test/qt/dev/projects/TestProject/buildrproxychecker2Desktop_Qt_5_15_2_clang_64bitDebug/debug/ch2.app/Contents/Resources/qml/QtQml/Models.2/libmodelsplugin.dylib.dSYM/Contents/Resources/DWARF/libqtqmlstatemachine.dylib " ...
环境信息
- Qt 5.15.2
- Xcode 10.3
- QtCreator 5.0
原有工程配置
.pro文件核心配置如下:
QT += core gui network sql quickwidgets quick quickcontrols2 ... lupdate_only { SOURCES += qml } ... macdeployqt $${DESTDIR}/$${TARGET}.app -qmldir=$${PWD}/qml -always-overwrite;
已尝试操作
参考官方问题单QTBUG-57265方案,去掉-always-overwrite参数调用macdeployqt,问题未解决。
根因说明
该错误是macdeployqt的逻辑缺陷导致:工具会错误将.app包内qml目录下的.dSYM调试符号文件夹内的DWARF格式文件识别为需要处理的动态库,该类文件不是标准可执行动态库,因此otool和install_name_tool均无法解析处理。
解决方案
可根据使用场景选择以下任意一种方案:
- 临时手动处理
构建完成后先删除.app包内所有.dSYM目录,再手动执行macdeployqt命令。 - 自动化工程配置
在.pro文件中修改macdeployqt相关配置,执行部署前先自动删除冗余的dSYM文件:
macx { # 先删除app包内qml目录下的所有dSYM调试文件 QMAKE_POST_LINK += && rm -rf $${DESTDIR}/$${TARGET}.app/Contents/Resources/qml/**/*.dSYM # 再执行部署命令 QMAKE_POST_LINK += && macdeployqt $${DESTDIR}/$${TARGET}.app -qmldir=$${PWD}/qml -always-overwrite }
- 关闭调试符号生成(仅适合发布场景)
如果只需要构建发布版本,可关闭调试符号生成,从根源避免dSYM文件生成:
CONFIG += release QMAKE_CFLAGS_RELEASE -= -g QMAKE_CXXFLAGS_RELEASE -= -g
内容的提问来源于stack exchange,提问作者Konstantin Sautkin
相关产品推荐
相关产品推荐

