【问题标题】:Qt static linking and deploymentQt 静态链接和部署
【发布时间】:2010-11-03 21:58:33
【问题描述】:

我正在尝试部署(向公众发布)我最近制作的一个简单的 qt 应用程序,但被静态链接 qt 库卡住了。

我按照 qt 文档上的指南静态地重新构建 qt 和我的应用程序。但是发布版本仍然需要 qtgui / qtcore dll 没有明显的原因,我想知道是否有人以前见过这种问题?或者更好,已经成功解决了吗?

http://doc.qtsoftware.com/4.5/deployment-windows.html

【问题讨论】:

  • 你有 QtCore4.a、QtGui4.a 的静态副本吗?然后添加 CONFIG += static 可以解决这个问题。如果您没有 Qt 的静态副本,请获取源代码并构建。获取静态库需要几个小时。

标签: windows qt deployment static


【解决方案1】:

我写了a guide to static linking

How to build Qt static with multiple compilers and keep it small

(因为它可以变得非常大,尤其是对于简单的程序)。 您可能还想查看 BitRock 安装程序,它对开源项目是免费的。

简而言之,如果您使用 Qt 认为是插件的任何东西,例如对大多数图像类型(JPEG、GIF)或数据库的支持,结果会稍微复杂一些。 例如,如果您想为您的图标添加对 Oracle DBMS 和 GIF 图像的支持,请将以下内容添加到您的 .PRO 文件中:

QTPLUGIN += qsqloci qgif
CONFIG += static

然后您需要:

#include <QtPlugin>

在您的项目中,并导入使用的任何插件。您需要更改这些设置以使其再次使用动态链接进行编译(例如在调试或添加功能时),尽管这可以很容易地自动化。在构建用于静态链接的 Qt 库时也有一些注意事项,尽管 Qt 说明至少可以帮助您入门。

【讨论】:

【解决方案2】:

使用 Qt 5.5,事情变得非常简单。在构建 Qt 之前,您必须运行 configure 脚本。您将以下正交设置传递给configure

  1. 您想要一个静态 Qt 库吗?

-static 选项应传递给configure

  1. 您希望 Qt 和您的应用程序的构建使用静态 C++ 运行时吗?

-static-runtime 选项应传递给configure

  1. 您想要 XP 定位吗?

-target xp 选项应传递给configure

此外,请按照this blog post 的说明进行操作。

Qt Creator 至少在 v.3.5.0 之前不支持 XP 自动定位,因为它没有为构建工具正确设置环境。您必须手动修改构建环境per the blog post

【讨论】:

    【解决方案3】:

    另外,请注意,您的静态构建仍将动态链接到 Visual Studio 运行时!

    this faq (internet archive link, in case the link goes away):

    为什么静态构建的 Qt 使用动态 Visual Studio 运行时库?我需要在我的应用程序中部署这些吗?

    Qt 是使用 -MD(d) 开关构建的,该开关链接到动态 C/C++ 运行时库。这是必要的,因为我们在使用除 -MD(d) 标志之外的任何东西时都遇到过内存问题,通常建议使用。您不应该为您的应用程序自己更改此标志,因为如果您将标志更改为 -MT,它与 Qt 库的构建方式相冲突。您也不应该为 Qt 更改它,因为它可能会导致问题。

    当使用 -static 选项时,Qt 仍然是静态构建的,这意味着您在部署应用程序时不需要分发 Qt dll。不过,您必须分发 C 运行时(如果目标计算机上尚不存在它们),请参阅我们的部署文档http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies

    【讨论】:

      【解决方案4】:

      msys2 有一个预建的static Qt5 package

      例如pacman -S mingw-w64-qt5-static

      目前,要同时使用 CMake 静态链接 Qt 的所有依赖项,您需要添加:
      list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
      在致电find_package(Qt5之前……


      CMAKE_AUTOSTATICPLUGINS 已被新的上游实现取代,不再需要。

      【讨论】:

      • 我想用这个,但不知道如何设置CMAKE_AUTOSTATICPLUGINS。我正在使用 qmake 然后制作。你能建议吗?
      • 您是否在此处输入错误 qmake,因为这里是关于 CMake 的。您可以将其设置为全局:set(CMAKE_AUTOSTATICPLUGINS ON) 或作为目标特定属性:set_target_properties(${PROJECT_NAME} PROPERTIES AUTOSTATICPLUGINS ON)
      【解决方案5】:

      我刚刚静态编译了一个应用程序(调试) 使用 QT 插件(5.9), 与 VS (2015) (Win)。

      a) 添加到您的代码中。

      #include <QtPlugin>
      Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);
      

      b) 将以下内容添加到链接路径

      \5.9.0_x86_static_install\lib
      \5.9.0_x86_static_install\bin
      \5.9.0_x86_static_install\plugins
      \5.9.0_x86_static_install\plugins\platforms
      \5.9.0_x86_static_install\plugins\imageformats
      

      c) 将 QT 静态库和内部 VS 库的列表添加到您的链接列表中。

      version.lib
      imm32.lib
      shlwapi.lib
      rpcrt4.lib
      Ws2_32.lib
      Mpr.lib
      Netapi32.lib
      Rpcrt4.lib
      Iphlpapi.lib
      winmm.lib
      gdi32.lib
      advapi32.lib
      msimg32.lib
      UxTheme.lib
      translatord.lib
      preprocessord.lib
      d3d9.lib
      dxguid.lib
      libEGLd.lib
      libGLESv2d.lib
      iphlpapi.lib
      psapi.lib
      ws2_32.lib
      Dwmapi.lib
      Qt5CoreD.lib
      Qt5Guid.lib
      Qt5Xmld.lib
      Qt5Widgetsd.lib
      Qt5Networkd.lib
      Qt5Winextrasd.lib
      Qt5PlatformCompositorSupportd.lib
      qicod.lib
      qtmaind.lib
      qtlibpngd.lib
      qtharfbuzzd.lib
      qtpcre2d.lib
      qwindowsd.lib
      Qt5FontDatabaseSupportd.lib
      Qt5ThemeSupportd.lib
      Qt5EventDispatcherSupportd.lib
      Qt5AccessibilitySupportd.lib
      qtfreetyped.lib
      

      凯文·希金斯

      【讨论】:

      • 这对我很有帮助,我错过了您在此处提到的一个 .lib 并出现有线链接错误,非常感谢
      • 嘿凯文!感谢分享!请问你用什么配置用静态链接构建qt?我去了 Src 文件夹并做了:“configure -platform win32-msvc -static -release -nomake examples -nomake tests -opensource”,我还注意到在你的答案中,你链接的库是调试库,所以我当然更改为发行版之一,但仍然出现链接错误。我想我将不得不再次重新构建 qt 并尝试构建以进行调试和发布
      【解决方案6】:

      我推荐你使用linuxdeployqt这个工具。它可以帮助解决大多数依赖问题。我用它成功地打包了我的 qt 应用程序。

      【讨论】:

      • linuxdeployqt 需要安装旧版本 glibc 的旧 linux 版本才能运行。我的所有 linux 环境都无法使用它。
      【解决方案7】:

      此答案适用于在 Windows 和 qmake 中使用 MSYS2mingw-w64 作为编译器。 QT版本是5.15.0。


      安装包qt5-static 为您提供了一个生成不依赖任何QT DLL 的可执行文件的QT 构建。 (示例命令行 - pacman -Ss mingw64/mingw-w64-x86_64-qt5-static)。

      但是这里引入了一个新问题:它没有将-static 标志传递给gcc。这意味着虽然可执行文件不依赖于 QT DLL,但它确实依赖于 libgcc-s、libwinpthread.dll 等。

      通常,这个问题可以通过使用CONFIG += static 来解决,这会导致qmake 将-static 传递给gcc。但是,正如其他答案中所述,对于 qt-static 构建,该配置选项被忽略!

      为了解决这个问题,我必须在 qmake 文件中手动指定用于静态链接的 gcc 标志,即:

      QMAKE_CXXFLAGS += -static
      QMAKE_LFLAGS_WINDOWS += -static
      

      这会产生一个(大)二进制文件,除了 Windows 系统 DLL 之外没有外部依赖项。

      (以防万一:我的用例是构建一个 COM 进程内服务器 DLL,它应该没有外部依赖项;我还使用了 TEMPLATE=libCONFIG += dll)。

      【讨论】:

        猜你喜欢
        • 2012-03-22
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多