c++ - 什么是 msvc_make.bat?

标签 c++ visual-studio qt qt-creator qmake

我有一个带有微软编译器的 Qt 项目设置(尽管我使用的是 QtCreator),我注意到它似乎创建了一个名为 msvc_make.bat 的文件,当前内容是

chcp 65001
"C:\Qt\Tools\QtCreator\bin\jom.exe" %*

这样做的目的是什么?

最佳答案

必备知识

使用 qmake 为您的项目创建 makefile 时,或者nmakejom用于执行命令。

事情发生在哪里?

在 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.exenmake.exe )

之后,当存在带有键“VSLANG”的环境变量(包含有关 VSCode 语言的信息)时,将调用 wrappedMakeCommand() 函数

在函数 wrappedMakeCommand() 中,开发人员在执行之前使用批处理文件 ( MSVC_make.bat ) 添加另一个命令 chcp 65001 make 文件使 UTF-8 编码能够理解不同语言的符号,以防系统以另一种语言(例如日语)运行。

免责声明:

所有这些信息都是我对这个文件存在原因的解释(从 qt 创建者的源代码中获得的知识),我不能 100% 确定这是否是正确的原因,但这对我来说是有意义的,所以在这里回答。

如果有任何更正,请通过评论告诉我。

来源和有用的链接:-

  1. Source code of Qt creator (来自 github)
  2. source code of msvctoolchains.cpp (创建文件的位置)
  3. What is jom ?
  4. about chcp
  5. about qmake

关于c++ - 什么是 msvc_make.bat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66166560/

相关文章:

c++ - 将外部事件循环与 Qt 相结合

c++ - 从编译器的角度来看,如何处理数组的引用,以及为什么不允许按值传递(而不是衰减)?

c++ - 从较大的数据类型(结构)转换为较小的数据类型

visual-studio - 有人可以解释 VS 2008 中不同构建操作的目的吗?

vb.net - 自动分配ID

qt - 如何将 QAbstractItemModel 序列化为 QDataStream?

c++ - 带有 Visual Studio 的 C++ 中的静态对象

visual-studio - 是否可以在 Visual Studio 中为 TypeScript 方法/类生成注释?

c++ - 在 Visual Studio Proj 中使用 QT .qrc 文件...?

c++ - 无法分配给 qstring 变量