我很难部署我的Qt / C ++应用程序,可能是因为我没有在网上找到这方面的好介绍。简而言之,我的问题是如何设置一个安装框架,在发送给用户之前只需要最少的编辑,或者最好不需要编译。
我想将GUI部署到不同平台上的用户,这些用户可能拥有或不拥有其计算机上的管理员权限。我找到了不同的选择:
静态编译Qt - >静态编译可执行文件 - >分发可执行文件。通过此设置,我遇到了Windows安全警告,需要管理员权限(我还没有在Linux / macOS上试过)。坦率地说,这种方法似乎不是最优的,因为我的编译器不知道如何为我的用户进行最佳编译。
创建安装程序。但是我开始感到困惑......我是否需要提供我的GUI的静态编译可执行文件,或仅提供安装程序,或者两者都没有?或者我可以通过使用内置编译器/库的Qt安装程序来避免在我身边进行预编译吗?
答案 0 :(得分:1)
显然,您需要在要分发它的每个平台上构建应用程序。最简单的方法是将所有QT库动态链接到您的应用程序。之后,您需要做的就是提供您的应用程序(如在windows上的exe文件,或linux等可执行文件)和您使用的QT库(Windows上的DLL,我认为在Linux上的SO文件等)
例如(在Windows上)如果您的应用程序名为MyApp并使用QTGui,QTWidgets和QTNetwork,那么您需要分发以下文件:
你可以将它们全部压缩成拉链,创建一个安装程序等。
编辑在评论中跟进后,很少有笔记。
标准库(你称之为具有vector
类的默认库)是c / c ++运行时(在windows上)的一部分,或安装在linux系统等上,所以不,你没有担心这个。我无法对所有编译器说,但对于某些编译器,您可以指定一个标志/参数来静态链接此运行时(很少需要这样做)。
在Windows上有一个名为dependency walker的工具,它提供了运行应用程序所需的所有DLL的列表。在Linux系统上,我不知道,真的不需要。但是对于你自己的应用程序,你知道你需要哪些库,因为你写了它:)
答案 1 :(得分:1)
通过此设置,我遇到了Windows安全警告
您没有签署二进制文件。这个问题与Qt无关。即使分发了一个微不足道的“Hello World”,你也会面对它。
确保您签署以下所有:
可执行文件。
您重新分发但未签名的所有DLL(验证每个DLL)。
安装程序。
我的编译器不知道如何为我的用户进行最佳编译。
由于C ++不使用实时编译,因此这种说法是不言而喻的。当您动态链接时,如果您暗示需要特定于CPU的代码变体,那么编译器也将“不知道”如何“为您的用户”进行最佳编译。这必须通过具有多个可执行文件来解决,每个可执行文件都针对特定CPU进行编译,并在安装时选择它们。不过,我认为你不是那个意思。但后来我不明白你的意思是“为我的用户进行最佳编译”。
我是否需要提供静态编译的GUI可执行文件
这取决于你。如果您不提供静态编译的可执行文件,则需要提供所有依赖项:编译器的C ++运行时以及Qt所需的所有库和插件。
在Windows,Linux和OS X上生成静态链接可执行文件的过程是相同的。您首先使用静态配置的Qt(configure -static -static-runtime
)副本,然后构建它,然后使用它来构建您的应用程序。最终产品将静态链接到C ++运行时和Qt库。
我是否需要提供安装程序的静态编译可执行文件
仅当您使用C ++编译器自己编译安装程序时。大多数安装程序生成器程序包负责创建没有其他依赖项的安装程序,即您可以在裸Windows系统上运行它。
我是否可以通过使用Qt的安装程序来避免在我身边进行预编译
Qt不提供预先构建的安装程序以供重复使用。
您可以使用例如NSIS将部署编译器运行时,Qt库和插件,以及您需要的应用程序和任何数据文件。
或者您可以静态编译应用程序,使其没有依赖项,并且是单个.exe文件,并将其作为便携式应用程序。它也可以自行安装,即您可以在应用程序中捆绑安装程序,并且在启动时应用程序可以检测它是否已经安装,如果没有,它将以管理模式重新启动并执行安装。