如何解决msvc_make.bat 是什么? 免责声明:来源和有用的链接:-
我有一个带有微软编译器的 Qt 项目设置(虽然我使用的是 QtCreator),我注意到它似乎创建了一个名为 error
的文件,当前内容是
error
这样做的目的是什么?
解决方法
必备知识
在使用 qmake
为您的项目创建 makefile 时,nmake 或 jom 用于执行命令。
它发生在哪里?
在Qt creator的源代码中,这个文件( msvc.bat
)是通过函数wrappedMakeCommand()
{on line 1091}
msvctoolchain.cpp
文件中创建的
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 command
以构建项目。
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
)
之后,wrappedMakeCommand()
函数在存在键为“VLANG”的环境变量(包含有关 VSCode 的语言的信息)时调用
在函数 wrappedMakeCommand()
中,开发人员使用批处理文件 ( MSVC_make.bat
) 在执行 make 文件之前添加另一个命令 chcp 65001
使 UTF-8 编码能够理解来自不同语言以防万一系统以另一种语言运行(比如日语)。
免责声明:
所有这些信息都是我对这个文件为什么存在的解释(从 qt creator 的源代码中获得的知识),我不能 100% 确定这是否是正确的原因,但对我来说是有道理的在这里回答。
如有任何更正,请通过评论告诉我。
来源和有用的链接:-
- Source code of Qt creator(来自 github)
- source code of msvctoolchains.cpp(创建文件的位置)
- What is jom ?
- about chcp
- about qmake
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。