如何在Windows下将Qt5构建为静态库

时间:2018-10-19 12:48:07

标签: windows deployment configuration qt5 static-libraries

要将Qt应用程序作为简单的.exe文件分发给Windows用户,需要将其与静态版本的Qt库静态链接。假设我们在开放许可证下分发许可证,以便允许静态链接Qt。因此,我们只需要Qt5Core,Qt5Gui,Qt5Widgets的静态库二进制文件。如何获得它们?

Qt5的二进制发行版仅包含动态库。它也包含一些.lib文件-但是请注意,这些不是静态库,而是一些辅助文件。它们的大小可以与真正的静态库区分开:真正的静态库要大得多(对于Qt5组件,很多MB)。因此,我们需要自己静态编译Qt5。事实证明这非常困难。

官方说明(http://doc.qt.io/qt-5/windows-building.html)几乎没有用:太短了,甚至无法传达任务难度。当前缺少如何将Qt5编译为静态库的精确,最新的分步指南。我们应该在这里。

1 个答案:

答案 0 :(得分:2)

简短的答案:不要在此上浪费您的时间。动态链接,并让安装程序分发您的应用程序。这是Qt5和CMake严重支持的唯一模式。没有他们的支持和反对他们的建议的工作几乎是没有希望的。设置安装程序要容易得多(尽管也没有什么乐趣-我们目前使用https://hk.saowen.com/a/d1cf90fcfea6d511629fd5a6c8113808721a7f19656677e8a5fab370a8d35cd4中的黑魔法)。

冗长(但尚未完成)的答案,以防您想骗我:

以下步骤使我看似接近解决方案。我成功构建了静态库,但无法链接我的应用程序:在收到数百个由于无法解析的外部符号而导致的LNK2001和LNK2019错误时,我不得不放弃。

因此,本文逐步介绍了2018年10月在Windows10虚拟桌面上对我有用的内容。对于每个安装步骤,都会进行检查。如果检查失败,请先解决问题,然后再继续。

要开始,请安装稍后需要的一些工具:

  • Perl ,是zlib和openssl配置所必需的:
    • 跳过“ perl -v”是否有效。
    • https://www.activestate.com/activeperl获取安装程序
    • 运行安装程序->将安装到C:\ Perl64。
    • 检查:重新启动终端,然后尝试“ perl -v”。
  • 可以处理Unix行尾的编辑器。记事本不会。安装 vim emacs 或其他任何方式。
  • 巧克力软件包管理器,需要安装flex和bison:
    • 运行管理外壳(Circle菜单>搜索“命令”>右键单击“命令提示符”>以管理员身份运行)
    • https://chocolatey.org/install#install-with-cmdexe复制下载命令
    • 将命令粘贴到管理外壳,并观看安装情况
    • 检查:在终端中,尝试命令“ choco”
  • qtbase编译所需的
  • flex bison
    • 获得正确版本的flex并不明显。从gnuwin32.sourceforge.net,我得到了一个过时的flex,它错过了Qt编译期间所需的命令行参数。从源代码编译flex会带来更多依赖关系。我找到的最简单的解决方案是使用Chocolatey软件包管理器。
    • 在管理外壳中,运行:“ choco install winflexbison3”。这将创建一个目录 X ,其中包含二进制文件win_flex.exe和win_bison.exe以及一个支持的“数据”文件夹。找出 X 的位置。就我而言, X = C:\ ProgramData \ chocolatey \ lib \ winflexbison3 \ tools
    • 检查:cd X ,然后运行“ win_flex --version”,“ win_bison --version”。
    • 在Qt编译期间,将需要使用这些工具的标准名称“ flex”和“ bison”。因此,我们需要符号链接flex-> win_flex,野牛-> win_bison。
      • mlink X \ flex.exe X \ win_flex.exe
      • mlink X \ bison.exe X \ win_bison.exe
      • 注意:mklink需要绝对路径才能可靠地工作
      • 注意:符号链接不得转到其他目录,以免野牛无法找到“数据”文件夹
    • X 添加到%PATH%
    • 检查:在任何外壳中尝试“ flex --version”和“ bison --version”

到目前为止,对于工具。现在我们需要两个必须静态链接到Qt的库(从https://stackoverflow.com/a/41815812/1017348中学到的魔术):

  • 构建静态 zlib
    • 下载https://zlib.net/zlib1211.zip
    • 解压到C:\ Development \ zlib-1.2.11
    • 使用可以处理Unix EOL的编辑器编辑文件win32 \ Makefile.msc:
      • 查找以CFLAGS开头的行
        • 用-GL -MT -Zc:wchar_t-
        • 替换-MD
      • 查找以LDFLAGS开头的行
        • 用-opt:icf -dynamicbase -nxcompat -ltcg / nodefaultlib:msvcrt替换-debug
    • 使用以下命令构建zlib(应少于一分钟):
      • nmake -f win32 / Makefile.msc AS = ml64 LOC =“-DASMV -DASMINF -DNDEBUG -I。” OBJA =“ inffasx64.obj gvmat64.obj inffas8664.obj”
    • 检查:因此,源目录必须包含zlib.lib(856kB)等。
  • 构建静态 openssl 库:
    • 下载https://www.openssl.org/source/openssl-1.1.1.tar.gz
    • 解压到C:\ Development \ openssl-1.1.1
    • 从zlib复制文件:cd zlib-1.2.11; xcopy zconf.h .. \ openssl-1.1.1 \;与zlib.h相同zlib.lib zlib.pdb
    • cd .. \ openssl-1.1.1
    • perl配置VC-WIN64A no-asm no-shared zlib no-zlib-dynamic线程--prefix = C:\ opt \ local_x64
      • 注意:我添加了“ no-asm”以避免安装NASM(Netwide汇编程序)
      • 注意:我更改了前缀,因为只有管理员才能安装到C:\ Windows
    • 编辑文件``makefile'':
      • 查找以以下内容开头的行:CFLAG
        • 附加:/ Zc:wchar_t- / GL / Zi
      • 查找以以下内容开头的行:LDFLAGS
        • 用/ incremental:no / opt:icf / dynamicbase / nxcompat / ltcg / nodefaultlib:msvcrt替换/ debug
      • 找到以以下内容开头的行:CNF_EX_LIBS
        • 用zlib.lib替换ZLIB1
    • 内部版本:“ nmake”
    • 检查:目录必须包含openssl.lib(大小?)

现在,我们准备使用Visual Studio C ++编译器的命令行版本从源代码构建 qtbase

  • 下载(最新Qt的更新位置):https://download.qt.io/archive/qt/5.11/5.11.2/submodules/qtbase-everywhere-src-5.11.2.zip
    • 打开包装大约需要20'
  • 将源目录移动到本地磁盘(C:\ Development)
    • 要使用Visual Studio,请使用经过特殊配置的终端。使用任务栏>圆形>搜索以启动“ VS 2017的x64本机工具命令提示符”
  • cd qtbase ...
  • 检查:配置--help
  • 配置-platform win32-msvc2017 -opensource-确认许可证-发布-static -openssl链接的no-dbus -no-libpng -no-libjpeg -nomake示例-nomake测试-prefix C:\ opt \ local_x64 -IC :\ Development \ openssl-1.1.1 \ include -LC:\ Development \ openssl-1.1.1 -D OPENSSL_LIBS = C:\ Development \ openssl-1.1.1 \ libssl.lib
  • nmake
  • 检查:静态库(大.lib和小.prl)位于目录lib /中
    • 54.7 MB Qt5Core.lib
    • 23.4 MB Qt5Widgets.lib
    • 18.2 MB Qt5Gui.lib
    • 07.4 MB Qt5Network.lib
    • ...

就是这样,我们有静态的Qt库。只是,如上所述,当我尝试将应用程序与这些库链接时,这无济于事。