【问题标题】:How to Automatically Run C++11 on Sublime Text 3 on macOS?如何在 macOS 上的 Sublime Text 3 上自动运行 C++11?
【发布时间】:2019-08-22 22:42:50
【问题描述】:

我想使用 Sublime Text 3 构建系统自动运行 c++:

当我手动设置构建系统时它可以工作:

> Tools > Build System > C++11

我应该改变什么才能设置,

> Tools > Build System > Automatic 

并运行 C++11?

C++11.build-system

{
    "cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",
    "quiet": true,
    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
        {
            "name": "Build without C++11",
            "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
        }
    ]
}

测试

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
}

输出(手动)

Hello World!

输出(自动)

[Finished in 0.1s]

我的猜测是它可能会使用,

> Tools > Build System > C++ Single File 

C++ Single File.build-system:

// {
//  "shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
//  "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
//  "working_dir": "${file_path}",
//  "selector": "source.c++",

//  "variants":
//  [
//      {
//          "name": "Run",
//          "shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
//      }
//  ]
// }

{
    "cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
    {
            "name": "Run with C++11",
            "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
        {
            "name": "Build without C++11",
            "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
        }
    ]
}

【问题讨论】:

  • 在什么情况下它不起作用?乍一看,只要您第一次选择合适的变体,它就应该可以工作;如果你这样做了但它失败了,我的下一个猜测是使用shell_cmd 而不是cmd。另请注意,您的 run 变体不包括使用 C++ 11 的参数。

标签: c++ c++11 sublimetext3


【解决方案1】:

Sublime 根据使用的语法为Automatic 选择构建系统,它与构建系统中的selector 相关联。对于 C 的情况,这是 source.c,对于 C++,它是 source.c++,依此类推。

当你选择Tools &gt; Build 时,Sublime 会将当前文件的语法与它当前知道的所有构建系统相匹配,并根据它进行选择。这里可能会发生一些不同的事情:

  1. 没有与文件范围关联的构建系统;当您执行构建时,未选择任何构建并且No Build System 会显示在状态栏中。在这种情况下,什么都不会发生。

  2. 只有一个版本与范围相关联;该构建被选择并直接执行。

  3. 与范围关联的版本不止一个。第一次发生这种情况时,Sublime 会通过一个快速面板提示您,询问您要执行什么构建,然后执行该构建。只要您保持构建系统设置不变,未来的构建将继续自动选择并使用该构建。

请务必注意,当您在构建系统中使用variant 时,虽然只有一个sublime-build 文件,但该文件定义了多个构建,因此在这种情况下,上面的#3 会自动应用。

从上面的构建系统来看,它似乎应该可以工作,特别是如果在 Tools &gt; Build System 菜单中手动选择构建系统符合您的预期。

您的自定义构建系统启用了quiet: true,这会阻止 Sublime 显示执行时间(以及构建失败的错误信息),但在自动构建的情况下,您上面的输出看起来像是在打印 [Finished]

因此我同意在这种情况下,Sublime 选择的构建系统与您预期的不同,这可能确实是内部构建(尽管根据您上面的输出,您可能已经修改了它)。

由于您提供的构建在您手动执行时有效,我最好的猜测是您遇到了上面的案例 3;与文件范围匹配的版本不止一个。

在这种情况下,使用Tools &gt; Build With... 会让 Sublime 再次提示你选择你想要的构建。这样做并确保您选择所需的构建可能会为您解决问题。

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 2018-03-22
    • 2017-06-28
    • 1970-01-01
    • 2014-04-22
    • 2014-03-01
    • 2023-03-07
    • 2019-01-11
    相关资源
    最近更新 更多