在Windows docker容器中编译Qt5项目

时间:2019-05-31 20:50:53

标签: c++ windows qt docker compiler-errors

我正在使用Qt5 5.12.2设置Docker容器,并且正在使用Microsoft Visual Studio 15编译器msvc2015_64构建我的项目。但是,我得到一个LNK1112:构建时,模块机器类型'x64'与目标机器类型'X86'发生冲突。

我的第一步是使用与Qt Creator生成的命令相同的命令构建Qt5项目:

C:\Qt\5.12.2\msvc2015_64\bin\qmake.exe C:\Users\userA\Desktop\Projects\myproj\app.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qtquickcompiler" && C:\Qt\Tools\QtCreator\bin\jom.exe qmake_all
C:\Qt\Tools\QtCreator\bin\jom.exe

这会产生机器类型冲突错误。

我尝试将以下路径添加到我的%path%env变量中:

C:\Windows\System32
C:\Qt\5.12.2\msvc2015_64\bin
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

已经在我的环境env变量中:

C:\Program Files (x86)\Windows Kits\8.1\bin\x86
C:\Program Files (x86)\Windows Kits\8.1\Windows Perormance Toolkit\

我还试图在Microsoft Visual Studio 14.0中运行.bat文件:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat

运行.bat文件的输出:

ERROR: Cannot determine the location of the VS Common Tools folder

我已经检查了这个错误,我认为建议是将C:\Windows\System32添加到环境变量%path%中。我试过了,但是有同样的错误。

我的Dockerfile:

FROM microsoft/windowsservercore:10.0.14393.1884
LABEL Description="Windows Server Core development environment for Qbs with Qt 5.12.2, Chocolatey and various dependencies for testing Qbs modules and functionality"

# Disable crash dialog for release-mode runtimes
RUN reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting" /v Disabled /t REG_DWORD /d 1 /f
RUN reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting" /v DontShowUI /t REG_DWORD /d 1 /f

# Install Qt5 5.12.2
COPY qtifwsilent.qs C:\\qtifwsilent.qs
RUN powershell -NoProfile -ExecutionPolicy Bypass -Command \
    $ErrorActionPreference = 'Stop'; \
    $Wc = New-Object System.Net.WebClient ; \
    $Wc.DownloadFile('http://download.qt.io/archive/qt/5.12/5.12.2/qt-opensource-windows-x86-5.12.2.exe', 'C:\qt.exe') ; \
    Echo 'Downloaded qt-opensource-windows-x86-5.12.2.exe' ; \
    $Env:QT_INSTALL_DIR = 'C:\\Qt' ; \
    Start-Process C:\qt.exe -ArgumentList '--verbose --script C:/qtifwsilent.qs' -NoNewWindow -Wait ; \
    Remove-Item C:\qt.exe -Force ; \
    Remove-Item C:\qtifwsilent.qs -Force
ENV QTDIR C:\\Qt\\5.12.2\\msvc2015
ENV QTDIR64 C:\\Qt\\5.12.2\\msvc2015_64
RUN dir "%QTDIR64%" && dir "%QTDIR64%\bin"

# Install choco for psuedo package manager
RUN @powershell -NoProfile -ExecutionPolicy Bypass -Command \
    $Env:chocolateyVersion = '0.10.8' ; \
    $Env:chocolateyUseWindowsCompression = 'false' ; \
    "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
RUN choco install -y python2 --version 2.7.14 && refreshenv && python --version && pip --version
RUN choco install -y qbs --version 1.9.1 && qbs --version
RUN choco install -y unzip --version 6.0 && unzip -v
RUN choco install -y visualcpp-build-tools --version 14.0.25420.1 && dir "%PROGRAMFILES(X86)%\Microsoft Visual C++ Build Tools"
# RUN choco install -y windows-sdk-10.1
# RUN choco install -y vcredist2008 --version 9.0.30729.6161
# RUN choco install -y vcredist2010
RUN choco install -y zip --version 3.0 && zip -v

# for building the documentation
RUN pip install beautifulsoup4 lxml

我设置Qt5的qtifwsilent.qs具有以下组件:

    widget.deselectAll();
    widget.selectComponent("qt.qt5.5122.win32_msvc2015");
    widget.selectComponent("qt.qt5.5122.win64_msvc2015_64");
    widget.selectComponent("qt.qt5.5122.qtcharts");
    widget.selectComponent("qt.qt5.5122.qtdatavis3d");
    widget.selectComponent("qt.qt5.5122.qtpurchasing");
    widget.selectComponent("qt.qt5.5122.qtvirtualkeyboard");
    widget.selectComponent("qt.qt5.5122.qtwebengine");
    widget.selectComponent("qt.qt5.5122.qtnetworkauth");
    widget.selectComponent("qt.qt5.5122.qtwebglplugin");
    widget.selectComponent("qt.qt5.5122.qtscript");
    widget.selectComponent("qt.tools.vcredist_msvc2015_x86");
    widget.selectComponent("qt.tools.vcredist_msvc2015_x64");

我希望项目能够生成并生成一个exe文件。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,所以我将其发布在这里以供将来参考。

我必须更新Dockerfile才能使用更高版本的servercore以及随附的必需Windows套件。我还必须向我的%path%环境变量添加几个路径,如下所示。

FROM mcr.microsoft.com/windows/servercore:ltsc2019
LABEL Description="Windows Server Core development environment for Qbs with Qt 5.12.2, Chocolatey and various dependencies for testing Qbs modules and functionality"

# Disable crash dialog for release-mode runtimes
RUN reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting" /v Disabled /t REG_DWORD /d 1 /f
RUN reg add "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting" /v DontShowUI /t REG_DWORD /d 1 /f

# Install Qt5 5.12.2
COPY qtifwsilent.qs C:\\qtifwsilent.qs
RUN powershell -NoProfile -ExecutionPolicy Bypass -Command \
    $ErrorActionPreference = 'Stop'; \
    $Wc = New-Object System.Net.WebClient ; \
    $Wc.DownloadFile('http://download.qt.io/archive/qt/5.12/5.12.2/qt-opensource-windows-x86-5.12.2.exe', 'C:\qt.exe') ; \
    Echo 'Downloaded qt-opensource-windows-x86-5.12.2.exe' ; \
    $Env:QT_INSTALL_DIR = 'C:\\Qt' ; \
    Start-Process C:\qt.exe -ArgumentList '--verbose --script C:/qtifwsilent.qs' -NoNewWindow -Wait ; \
    Remove-Item C:\qt.exe -Force ; \
    Remove-Item C:\qtifwsilent.qs -Force
ENV QTDIR C:\\Qt\\5.12.2\\msvc2015
ENV QTDIR64 C:\\Qt\\5.12.2\\msvc2015_64
RUN dir "%QTDIR64%" && dir "%QTDIR64%\bin"

# Install choco for psuedo package manager
RUN @powershell -NoProfile -ExecutionPolicy Bypass -Command \
    $Env:chocolateyVersion = '0.10.14' ; \
    $Env:chocolateyUseWindowsCompression = 'false' ; \
    "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
RUN choco install -y python2 --version 2.7.14 && refreshenv && python --version && pip --version
RUN choco install -y qbs && qbs --version
RUN choco install -y unzip --version 6.0 && unzip -v
RUN choco install -y vcbuildtools -ia "/Full"
RUN choco install -y zip --version 3.0 && zip -v
RUN choco install -y cmake
RUN choco install -y windows-sdk-10.1
RUN choco install -y vcredist2008 --version 9.0.30729.6161
RUN choco install -y vcredist2010

# for building the documentation
RUN pip install beautifulsoup4 lxml

WORKDIR C:\\Users\\ContainerUser

对于我使用的环境路径:

set path=%path%;"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC";C:\Qt\5.12.2\msvc2015_64\bin;"C:\Program Files (x86)\Windows Kits\10\bin\x64";"C:\Program Files (x86)\Windows Kits\8.1\bin\x64";C:\Qt\Tools\QtCreator\bin;

# Run this command to setup cl.exe
vcvarsall.bat x86_amd64