如何用qt分发代码

How to distribute code with qt?

本文关键字:代码 qt 何用      更新时间:2023-10-16

我有使用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并看到应用程序会在正确的位置查找。