使用 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();
我想用 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();