我有一个带有微软编译器的 Qt 项目设置(尽管我使用的是 QtCreator),我注意到它似乎创建了一个名为 msvc_make.bat
的文件,当前内容是
chcp 65001
"C:\Qt\Tools\QtCreator\bin\jom.exe" %*
这样做的目的是什么?
最佳答案
必备知识
使用 qmake
为您的项目创建 makefile 时,或者nmake或jom用于执行命令。
事情发生在哪里?
在 Qt Creator 的源代码中,此文件 ( msvc.bat
) 是在 msvctoolchain.cpp
中创建的。通过函数 wrappedMakeCommand()
{on line 1091}
static QString wrappedMakeCommand(const QString &command)
{
const QString wrapperPath = QDir::currentPath() + "/msvc_make.bat";
QFile wrapper(wrapperPath);
if (!wrapper.open(QIODevice::WriteOnly))
return command;
QTextStream stream(&wrapper);
stream << "chcp 65001\n";
stream << "\"" << QDir::toNativeSeparators(command) << "\" %*";
return wrapperPath;
}
MsvcToolChain::makeCommand()
{line 1104} 函数使用它来创建 make 命令
来构建项目。
FilePath MsvcToolChain::makeCommand(const Environment &environment) const
{
bool useJom = ProjectExplorerPlugin::projectExplorerSettings().useJom;
const QString jom("jom.exe");
const QString nmake("nmake.exe");
Utils::FilePath tmp;
FilePath command;
if (useJom) {
tmp = environment.searchInPath(jom,
{Utils::FilePath::fromString(
QCoreApplication::applicationDirPath())});
if (!tmp.isEmpty())
command = tmp;
}
if (command.isEmpty()) {
tmp = environment.searchInPath(nmake);
if (!tmp.isEmpty())
command = tmp;
}
if (command.isEmpty())
command = FilePath::fromString(useJom ? jom : nmake);
if (environment.hasKey("VSLANG"))
return FilePath::fromString(wrappedMakeCommand(command.toString()));
return command;
}
当您仔细查看此函数的源代码时,您会发现它只是搜索所需的可执行文件(jom.exe
或 nmake.exe
)
之后,当存在带有键“VSLANG”的环境变量(包含有关 VSCode 语言的信息)时,将调用 wrappedMakeCommand()
函数
在函数 wrappedMakeCommand()
中,开发人员在执行之前使用批处理文件 ( MSVC_make.bat
) 添加另一个命令 chcp 65001
make 文件使 UTF-8 编码能够理解不同语言的符号,以防系统以另一种语言(例如日语)运行。
免责声明:
所有这些信息都是我对这个文件存在原因的解释(从 qt 创建者的源代码中获得的知识),我不能 100% 确定这是否是正确的原因,但这对我来说是有意义的,所以在这里回答。
如果有任何更正,请通过评论告诉我。
来源和有用的链接:-
- Source code of Qt creator (来自 github)
- source code of msvctoolchains.cpp (创建文件的位置)
- What is jom ?
- about chcp
- about qmake
关于c++ - 什么是 msvc_make.bat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66166560/