简短的答案:不要在此上浪费您的时间。动态链接,并让安装程序分发您的应用程序。这是Qt5和CMake严重支持的唯一模式。没有他们的支持和反对他们的建议的工作几乎是没有希望的。设置安装程序要容易得多(尽管也没有什么乐趣-我们目前使用https://hk.saowen.com/a/d1cf90fcfea6d511629fd5a6c8113808721a7f19656677e8a5fab370a8d35cd4中的黑魔法)。
冗长(但尚未完成)的答案,以防您想骗我:
以下步骤使我看似接近解决方案。我成功构建了静态库,但无法链接我的应用程序:在收到数百个由于无法解析的外部符号而导致的LNK2001和LNK2019错误时,我不得不放弃。
因此,本文逐步介绍了2018年10月在Windows10虚拟桌面上对我有用的内容。对于每个安装步骤,都会进行检查。如果检查失败,请先解决问题,然后再继续。
要开始,请安装稍后需要的一些工具:
- Perl ,是zlib和openssl配置所必需的:
- 可以处理Unix行尾的编辑器。记事本不会。安装 vim , emacs 或其他任何方式。
- 巧克力软件包管理器,需要安装flex和bison:
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
- 内部版本:“ 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
- 将源目录移动到本地磁盘(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库。只是,如上所述,当我尝试将应用程序与这些库链接时,这无济于事。