首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分布式Qt/C++跨平台应用程序

分布式Qt/C++跨平台应用程序
EN

Stack Overflow用户
提问于 2017-05-09 06:25:07
回答 2查看 621关注 0票数 1

我很难部署我的Qt/C++应用程序,可能是因为我还没有在网上找到一个很好的介绍。简单地说,我的问题是如何在发送给用户之前设置一个只需要最少编译,或者最好是不编译的安装框架。

我希望将GUI部署到不同平台上的用户,这些用户可能拥有或可能没有他们的计算机上的管理权限。我找到了不同的选择:

  • 静态编译Qt ->静态编译可执行文件->分发可执行文件。通过这个设置,我遇到了一个Windows安全警告,它需要管理员权限(我还没有在Linux /macOS上尝试)。坦率地说,这种方法似乎不太理想,因为我的编译器不知道如何为我的用户进行优化编译。
  • 创建一个安装程序。但现在我开始感到困惑..。我是否需要为我的GUI提供静态编译的可执行文件,还是只提供安装程序的可执行文件,或者两者都不提供?或者,我可以通过使用来自Qt的安装程序和内置编译器/库来避免在我这一方进行预编译吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-09 12:44:23

使用此设置,我遇到了Windows安全警告

你没有在二进制文件上签名。这个问题与Qt无关。即使在分发一个微不足道的"Hello“时,你也会面对它。

确保您签署了以下所有:

  1. 那些可执行的。
  2. 重新分发且未签名的所有DLL(请验证每个DLL)。
  3. 安装程序。

我的编译器不知道如何为用户优化编译。

由于C++不使用即时编译,所以这句话是不言而喻的.当您动态链接时,如果您暗示您需要特定于CPU的代码变体,编译器也将“不知道”如何“为您的用户最佳地编译”。这必须通过拥有多个可执行文件来解决,每个可执行文件都是为特定的CPU编译的,并在安装时选择它们。不过,我觉得你不是那个意思。但是,我不知道您所说的“为我的用户进行最佳编译”是什么意思。

我需要提供我的GUI静态编译的可执行文件吗?

由你决定。如果不提供静态编译的可执行文件,则需要提供所有依赖项:编译器的C++运行时以及Qt所需的所有库和插件。

在Windows、Linux和OS上生成静态链接的可执行文件的过程是相同的。首先是静态配置的Qt (configure -static -static-runtime)副本,然后构建它,然后使用它构建应用程序。最终产品将静态地链接到C++运行时和Qt库。

我需要提供一个静态编译的可执行文件吗?安装程序

只有当您使用C++编译器自己编译安装程序时。大多数安装程序生成器包负责创建一个没有附加依赖项的安装程序,即您可以在一个单独的Windows系统上运行它。

我是否可以通过使用来自Qt的安装程序来避免在我的身边进行预编译?

Qt不提供可重复使用的预构建安装程序。

您可以使用例如NSIS来部署编译器运行时、Qt库和插件,以及您的应用程序和它需要的任何数据文件。

或者您可以静态地编译应用程序,以便它没有依赖关系,并且是一个.exe文件,并将其作为可移植的应用程序使用。它也可以自动安装,也就是说,您可以将安装程序捆绑在应用程序中,并且在启动时应用程序可以检测它是否已经安装,如果没有,它将以管理模式重新启动自己并执行安装。

票数 1
EN

Stack Overflow用户

发布于 2017-05-09 06:34:21

显然,您需要在要将其分发到的每个平台上构建应用程序。最简单的方法是将所有QT库动态链接到应用程序。在此之后,您所需要做的就是提供您的应用程序(如windows上的exe文件,或linux上的可执行文件等)和您使用的QT库( windows上的DLL,所以我认为是linux上的文件等等)。

例如,(在windows上)如果您的应用程序名为MyApp,并使用QTGui、QTWidgets和QTNetwork,那么您可以分发以下文件:

  • MyApp.exe
  • QTCore.dll和其他几个DLL需要调用icu*.dll -不记得了)
  • QTGui.dll
  • QTWidgets.dll
  • QTNetwork.dll

您可以将它们全部压缩在一个zip中,创建一个安装程序等等。

编辑后,在评论的后续几个注意事项。

标准库(您称之为具有vector类的默认库)是c/c++运行时(在windows上)的一部分,或者安装在linux系统上等等,所以不需要担心这一点。我不能说对于所有编译器,但是对于某些编译器,您可以指定一个标志/参数来静态地链接这个运行时(很少需要这样做)。

windows上有一个名为dependency的工具,它给出了应用程序运行所需的所有all列表。在linux系统上,我不知道,从来没有真正需要一个。但是对于您自己的应用程序,您确实知道需要哪些库,因为您编写了:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43862542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档