如何用qt分发代码?

时间:2015-10-26 07:53:20

标签: c++ macos qt cmake

我有使用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库的应用程序?

2 个答案:

答案 0 :(得分:3)

Qt 5.5附带一个名为a(9)的{​​{3}}。您可以从命令行运行它,如果您要求,它将生成一个有效的macdeployqt(甚至包含该应用程序的.app)。它使用起来相当简单,只有少数选项(比如创建dmg输出,使用调试库......),如果你只依赖于Qt。

如果您有更多动态链接的依赖项,那么您可能还需要将它们嵌入到应用程序包(.dmg文件夹)中。

答案 1 :(得分:0)

来自QT site

但是在部署应用程序时,您的用户可能没有在指定位置安装Qt框架。因此,您必须在约定的位置提供框架,或者将框架存储在包本身中。无论您选择哪种解决方案,都必须确保框架为自己返回正确的标识名称,并且应用程序将查找这些名称。幸运的是,我们可以使用install_name_tool命令行工具来控制它。

install_name_tool以两种模式工作,-id和-change。 -id模式适用于库和框架,并允许我们指定新的标识名称。我们使用-change模式来更改应用程序中的路径。

让我们通过将Qt框架复制到Plug& amp;画包。查看otool对bundle的输出,我们可以看到我们必须将QtCore和QtGui框架都复制到bundle中。我们假设我们在构建bundle的目录中。

  

mkdir plugandpaint.app/Contents/Frameworks cp -R   /path/to/Qt/lib/QtCore.framework           plugandpaint.app/Contents/Frameworks cp -R /path/to/Qt/lib/QtGui.framework          plugandpaint.app/Contents/Frameworks

首先,我们在bundle中创建一个Frameworks目录。这遵循Mac OS X应用程序约定。然后,我们将框架复制到新目录中。由于框架包含符号链接,并且我们希望保留它们,因此我们使用-R选项。

  

install_name_tool -id   @executable_path /../框架/ QtCore.framework /版本/ 4.0 / QtCore          plugandpaint.app/Contents/Frameworks/QtCore.framework/Versions/4.0/QtCore   install_name_tool -id   @executable_path /../框架/ QtGui.framework /版本/ 4.0 / QtGui          plugandpaint.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui

然后我们运行install_name_tool来设置框架的标识名称。 -id之后的第一个参数是新名称,第二个参数是我们希望更改的标识框架。文本@executable_path是一个特殊的dyld变量,告诉dyld开始查看可执行文件所在的位置。新名称指定这些框架将位于Frameworks目录中的“一个目录”。

  

install_name_tool -change   路径/到/ QT / lib中/ QtCore.framework /版本/ 4.0 / QtCore           @executable_path /../框架/ QtCore.framework /版本/ 4.0 / QtCore           plugandpaint.app/Contents/MacOs/plugandpaint install_name_tool -change path / to / qt / lib / QtGui.framework / Versions / 4.0 / QtGui           @executable_path /../框架/ QtGui.framework /版本/ 4.0 / QtGui           plugandpaint.app/Contents/MacOs/plugandpaint

现在,动态链接器知道在哪里寻找QtCore和QtGui。然后我们必须使用install_name_tool的-change模式使应用程序知道库位置。这基本上归结为字符串替换,以匹配我们为框架设置的标识名称。

最后,由于QtGui框架依赖于QtCore,我们必须记得更改QtGui的引用:

  

install_name_tool -change   路径/到/ QT / lib中/ QtCore.framework /版本/ 4.0 / QtCore           @executable_path /../框架/ QtCore.framework /版本/ 4.0 / QtCore           plugandpaint.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui   毕竟,我们可以再次运行otool并查看该应用程序   将在合适的位置寻找。