如何用qt分发代码
How to distribute code with qt?
我有使用Qt的c++应用程序,我正在用cmake构建它并使用以下链接:
target_link_libraries(myApp Qt5::Widgets Qt5::OpenGL ...)
它工作得很好,但当我试图分发它的失败,因为缺少qt库。
我试图从我的本地qt安装Qt/5.4/clang_64/lib/QtCore.Framework/Versions/5/QtCore
和其他具有类似路径的库,并将它们放在myApp附近,但它没有帮助。它仍然试图从本地qt安装中获取这些库,如果我重命名本地qt安装文件夹,它会失败。
如何在OSX/Mac上使用qt库分发我的应用程序?
Qt 5.5附带了一个名为macdeployqt
的辅助工具。您可以从命令行运行它,它将产生一个有效的.app
(甚至.dmg
包含应用程序,如果你要求它)。这是相当直接的使用,只有几个选项(如创建dmg输出,使用调试库…),如果你只依赖于Qt。
如果你有更多动态链接的依赖项,那么你可能需要将它们也嵌入到应用程序包(.app
文件夹)中。
来自QT站点:
但是当你部署应用程序时,你的用户可能没有在指定的位置安装Qt框架。出于这个原因,您必须要么在一个商定的位置提供框架,要么将框架存储在bundle本身中。无论选择哪种解决方案,都必须确保框架为自己返回正确的标识名,并且应用程序将查找这些名称。幸运的是,我们可以使用install_name_tool命令行工具来控制它。
install_name_tool有两种工作模式:-id和-change。-id模式适用于库和框架,允许我们指定新的标识名。我们使用-change模式来修改应用程序中的路径。
让我们通过将Qt框架复制到Plug &漆包。查看otool的包输出,我们可以看到我们必须将QtCore和QtGui框架都复制到包中。假设我们在构建bundle的目录下。
mkdir plugandpaint。app/Contents/Frameworks///Qt/lib/QtCore.frameworkplugandpaint。cp -R/path/to/Qt/lib/QtGui.frameworkplugandpaint。应用程序/内容/框架
首先,我们在bundle中创建一个Frameworks目录。这遵循Mac OS X应用程序惯例。然后将框架复制到新目录中。因为框架包含符号链接,而我们希望保留它们,所以我们使用-R选项。
install_name_tool id@executable_path/. ./框架/QtCore.framework/版本/4.0/QtCoreplugandpaint.app/内容/框架/QtCore.framework/版本/4.0/QtCoreinstall_name_tool id@executable_path/. ./框架/QtGui.framework/版本/4.0/QtGuiplugandpaint.app/内容/框架/QtGui.framework/版本/4.0/QtGui
然后运行install_name_tool为框架设置标识名。-id后的第一个参数是新名称,第二个参数是我们希望更改的标识的框架。文本@executable_path是一个特殊的dyld变量,它告诉dyld开始查找可执行文件所在的位置。新名称指定这些框架将位于框架目录中的"一个目录上下"。
install_name_tool改改路径//Qt/lib/QtCore.framework/版本/4.0/QtCore@executable_path/. ./框架/QtCore.framework/版本/4.0/QtCoreplugandpaint。app/Contents/MacOs/plugandpaint install_name_tool -change path/to/qt/lib/QtGui.framework/Versions/4.0/QtGui@executable_path/. ./框架/QtGui.framework/版本/4.0/QtGuiplugandpaint。应用程序/内容/MacOs/plugandpaint
现在,动态链接器知道在哪里寻找QtCore和QtGui。然后,我们必须使用install_name_tool的-change模式让应用程序也知道库的位置。这基本上归结为字符串替换,以匹配我们为框架设置的标识名称。
最后,由于QtGui框架依赖于QtCore,我们必须记住更改QtGui的引用:
install_name_tool改改路径//Qt/lib/QtCore.framework/版本/4.0/QtCore@executable_path/. ./框架/QtCore.framework/版本/4.0/QtCoreplugandpaint.app/内容/框架/QtGui.framework/版本/4.0/QtGui在所有这些之后,我们可以再次运行otool并看到应用程序会在正确的位置查找。
- Qt Quick-如何仅从c++代码与qml属性交互
- 我无法在 qt 的C++代码中定义字符串
- 需要将一行代码从C++ Qt翻译成PyQt
- 在Qt/C++中从一个代码构建两个略有不同的项目
- 将 Qt 代码从 createTextureFromId 更新为 createTextureFromNativeObje
- Qt:更新 QString 时自动生成的代码失败
- Qt GUI使用Qfiledialogbox和qlabel显示视频,这是我的代码
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 运行Qt时处理退出代码0xC0000135 hello world
- 使用Qt Creator在调试模式下编译一段代码
- qt C++命令行代码中的分段错误(核心转储)
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 将Qt Designer项目转换为C++代码
- 如何从Qt QWebEngineView获取HTTP状态代码
- Qt创建者-如何删除Clang代码模型
- 使用其他编译器编译QT代码
- macOS+Qt+Intellisense上的Visual Studio代码
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- QT:AES-256-CBC 根据 PHP 代码在C++中加密/解密