Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Linux制作Qt应用程序的二进制分发_Linux_Qt_Deployment_Distribution - Fatal编程技术网

如何为Linux制作Qt应用程序的二进制分发

如何为Linux制作Qt应用程序的二进制分发,linux,qt,deployment,distribution,Linux,Qt,Deployment,Distribution,我正在开发跨平台的Qt应用程序。 它是免费的,但不是开源的。因此,我想将其作为已编译的二进制文件分发 在windows上没有问题,我将编译的exe与MinGW和Qt的DLL一起打包,一切都很顺利 但是在Linux上存在一个问题,因为用户可能在他/她的系统中拥有与我非常不同的共享库 Qt部署指南建议了两种方法:静态链接和使用共享库。 第一个生成巨大的可执行文件,还需要Qt依赖的许多库的静态版本,即,我必须从抓痕中重建所有库。第二种方法是在应用程序启动之前重新配置动态链接器,我觉得这有点棘手 任何人

我正在开发跨平台的Qt应用程序。 它是免费的,但不是开源的。因此,我想将其作为已编译的二进制文件分发

在windows上没有问题,我将编译的
exe
与MinGW和Qt的DLL一起打包,一切都很顺利

但是在Linux上存在一个问题,因为用户可能在他/她的系统中拥有与我非常不同的共享库

Qt部署指南建议了两种方法:静态链接和使用共享库。 第一个生成巨大的可执行文件,还需要Qt依赖的许多库的静态版本,即,我必须从抓痕中重建所有库。第二种方法是在应用程序启动之前重新配置动态链接器,我觉得这有点棘手


任何人都可以分享他/她在Linux下分发Qt应用程序的经验吗?我应该用什么方法?我可能会遇到什么问题?还有其他方法可以完成这项工作吗?

您也可以在Linux上分发Qt共享库。然后,让您的软件加载这些,而不是系统默认的。使用
LD\u LIBRARY\u PATH
环境变量可以覆盖共享库。这可能是最简单的解决方案。您始终可以在可执行文件的包装器脚本中对此进行更改

或者,只需指定用户需要在系统上安装的最低库版本。

不是这样的答案(sybreon对此进行了介绍),但请注意,如果二进制文件与Qt静态链接,则不允许您发布二进制文件,除非您购买了商业许可证,否则,您的整个二进制文件属于GPL(或者您违反了Qt的许可证)

如果你有商业执照,没关系

如果您没有商业许可证,您有两种选择:

  • 动态链接Qt v4.5.0或更新版本(LGPL版本-除了在开源应用程序中,您不能使用以前的版本),或

  • 打开源代码


  • 当我们在Linux上发布Qt应用程序(或者任何使用共享库的应用程序)时,我们会发布一个目录树,其中包含实际的可执行文件和相关的包装器脚本,顶部带有子目录,其中包含共享库和您不想链接的任何其他必要资源

    这样做的好处是,您可以让包装器脚本设置运行应用程序所需的所有内容,而无需担心用户设置环境变量、安装到特定位置等。如果操作正确,这还允许您不必担心从何处调用应用程序,因为它总是可以找到资源

    实际上,我们进一步采用这种树结构,将所有可执行和共享库放在平台/体系结构子目录中,这样包装器脚本就可以确定本地体系结构,调用该平台的适当可执行文件,并设置环境变量以找到适当的共享库。我们发现,当为共享一个公共文件系统的多个不同linux版本分发时,此设置特别有用

    尽管如此,如果可能的话,我们仍然喜欢静态构建,Qt应用也不例外。你完全可以静态地使用Qt进行构建,而不必像krbyrd在他的回答中指出的那样构建大量额外的依赖项。

    正是我所做的。您可以始终将库添加到LD\u LIBRARY\u PATH,也可以做一些更有趣的事情:

    为每个目录设置一个附带的Qt库。编写一个shell脚本,让它在可执行文件上运行
    ldd
    ,grep表示“未找到”,对于这些库中的每一个库,将适当的目录添加到列表中(我们称之为$ldd)。在您拥有了所有这些之后,运行二进制文件,并将LD_LIBRARY_PATH设置为它的上一个值加上$LDD


    最后是关于“我将不得不从划痕中重建它们”的评论。不,你不必。如果您有这些库的开发包,那么您应该有
    .a
    文件,您可以静态链接这些文件。

    本文提供了有关此主题的信息。我会亲自尝试:

    简言之:

    • 使用-platform linux-lsb-g++配置Qt
    • 应该进行链接 with–lsb使用默认链接器
    • 打包所有内容并部署(将 这里需要一些调整,但我还没有尝试过(抱歉)

    共享库是一种方法,但您可以避免使用
    LD\u LIBRARY\u PATH
    (这涉及使用启动程序外壳脚本等运行应用程序)使用
    -rpath
    编译器标志构建二进制文件,并指向存储库的位置

    例如,我将库存储在二进制文件旁边,或者存储在二进制文件旁边名为“mylib”的目录中。要在我的QMake文件中使用它,我在
    .pro
    文件中添加了这一行:

    QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/
    

    我可以用本地库覆盖任何系统库来运行二进制文件,而不需要启动程序脚本。

    您可以查看QtCreator文件夹并将其用作示例。它在qtcreator/bin中有qt.conf和qtcreator.sh文件

    lib/qtcreator是包含所有所需Qt*.so库的文件夹。qtcreator.sh中设置了相对路径,该路径应重命名为you-app-name.sh


    导入插件qml在bin目录中。它们的路径在qt.conf文件中设置。这是部署QML应用程序所必需的。

    在Linux上创建Qt应用程序包最简单的方法可能是。它收集所有必需的文件,并允许您构建一个在大多数Linux发行版上运行的

    确保您在最旧的仍然支持的基础上构建应用程序