使用 QProcess 在 Windows 64 位 OS 上使用 Qt 32 位套件编译 Qt 程序

Compile a Qt program with a Qt 32 bits kit on a Windows 64 bits OS with QProcess

我想用 Qt 32 位工具包在 Windows 64 位 OS 和 QProcess 上编译我的 Qt 程序。

我使用 64 位工具包进行编译,使用: C:/Qt/5.15.1/msvc2019_64/bin/qmake.exe 然后 C:/Qt/Tools/QtCreator/bin/jom.exe 它工作得很好。

我尝试用 32 位编译的事情:

QProcess envBuilder;

envBuilder.start("\"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/vcvars32.bat\"", QStringList());
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();

envBuilder.start("\"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/vcvarsall.bat\"", {"x86"});
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();

envBuilder.start("C:/Qt/5.15.1/msvc2019/bin/qtenv2.bat", QStringList());
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();

envBuilder.start("C:/Qt/5.15.1/msvc2019/bin/qmake.exe", {"MyProject.pro", "-o", "Makefile", "-spec", "win32-msvc", "\"CONFIG+=qtquickcompiler\""});
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();

envBuilder.start("C:/Qt/Tools/QtCreator/bin/jom.exe", {"-f", "Makefile", "/D", "release"});
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();

编译正确启动,但在链接时输出:

Qt5Charts.lib(Qt5Charts.dll) : fatal error LNK1112: module machine type 'x86' conflicts with target machine type 'x64'

我错过了什么?

您的错误是由于您使用 64 位库编译 32 位目标造成的(反之亦然)。

一方面,仔细选择您使用的 vcvarsXXXX.bat 版本。

我说行

C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/vcvars32.bat

您会发现这个 bat 文件针对不同的目标有很多变体。

另一方面,您可能还想验证您 compilation kits 中的路径是否不混合路径(例如:对 32 位套件使用 64 位路径,反之亦然)

您可能还想查看 here

感谢所有评论,最终起作用的是:

QProcess envBuilder;

envBuilder.start("\"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/vcvars32.bat\" && C:/Qt/5.15.1/msvc2019/bin/qtenv2.bat && C:/Qt/5.15.1/msvc2019/bin/qmake.exe", {"MyProject.pro", "-o", "Makefile", "-spec", "win32-msvc", "\"CONFIG+=qtquickcompiler\""});
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();

envBuilder.start("\"C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/vcvars32.bat\" && C:/Qt/Tools/QtCreator/bin/jom.exe", {"-f", "Makefile", "/D", "release"});
envBuilder.waitForFinished();
qDebug() << envBuilder.exitCode();
qDebug() << envBuilder.readAllStandardOutput();
qDebug() << envBuilder.readAllStandardError();