如何在Sublime Text 3中编译和运行C代码?

38
我想在Ubuntu 14.04的Sublime Text 3中编译和运行C程序。目前,使用gcc编译程序并通过执行命令(见下面的代码)在Sublime Text 3中进行编译,但我想知道是否可以使程序的执行输出也出现在Sublime Text控制台中。
以下是我目前使用Sublime Text 3编译C程序的内容:
c_compile.sublime-build
{
"cmd" : ["gcc", "$file_name", "-o", "${file_base_name}"],
"selector" : "source.c",
"shell":false,
"working_dir" : "$file_path"
}

我尝试像这样添加&& ./${file_base_name}

{
"cmd" : ["gcc", "$file_name", "-o", "${file_base_name}","&&","./${file_base_name}"],
"selector" : "source.c",
"shell":false,
"working_dir" : "$file_path"
}

但是它给我返回了这个错误:
gcc: error: &&: No such file or directory
[Finished in 0.0s with exit code 1]
[cmd: ['gcc', 'Ex1-6.c', '-o', 'Ex1-6', '&&', './Ex1-6']]
[dir: /home/admin/Desktop/C/book/chap1]
[path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games]

以下是我正在处理的简单C程序:

Ex1-6.c

#include <stdio.h>

main(){
    printf("Hello world");
}

我在网上搜索了解决方案,但所提供的答案要么只允许编译(这部分已经对我有效),要么无法工作。有没有办法修复这段代码,以便在Sublime Text 3中编译和运行呢?谢谢。 根据user2357112的建议进行编辑 #1:shell更改为true后:
{
"cmd" : ["gcc", "$file_name", "-o", "${file_base_name}","&&","./${file_base_name}"],
"selector" : "source.c",
"shell":true,
"working_dir" : "$file_path"
}

这是我得到的结果:

gcc: fatal error: no input files
compilation terminated.
[Finished in 0.0s with exit code 4]
[cmd: ['gcc', 'Ex1-6.c', '-o', 'Ex1-6', '&&', './Ex1-6']]
[dir: /home/admin/Desktop/C/book/chap1]
[path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games]

根据Eugene K的建议修改#2:

我尝试仅使用cmd运行程序:

{
"cmd" : ["./${file_base_name}"],
"selector" : "source.c",
"shell":false,
"working_dir" : "$file_path"
}

代码成功运行并在控制台上打印输出:

Hello world
[Finished in 0.0s with exit code 12]
[cmd: ['./Ex1-6']]
[dir: /home/amir/Desktop/C/book/chap1]
[path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games]

到目前为止,cmd 命令要么编译,要么运行,但不能同时进行,希望能够做些改进,使其可以用单个命令既编译又运行。


&& 是一个 shell 的东西。这可能不是一个好主意(我不知道如何使用 Sublime Text 3),但设置 "shell":true 可能会使事情正常工作。 - user2357112
我没有Sublime Text 3,但它似乎可以正常工作,它会将所有在“gcc”之后的输入作为一行发送给gcc,例如:> gcc“$filename -o .. && ...”你需要以某种方式转义这些双引号。也许创建第二个“cmd”条目?或者将shell设置为True。 - Eugene K
@user2357112 在我将 shell 更改为 true 后,我收到了这个错误消息:gcc: fatal error: no input files, compilation terminated. 而不是 gcc: error: &&。所以我猜你关于 shell 的事情是正确的,但还是不起作用 :/ - CMPS
@EugeneK 在添加了另一个命令后,如下所示:cmd:["./${file_base_name}"],现在第一个命令被覆盖了,文件只是运行而没有编译,这显示出一些有希望的解决方案。感谢您的建议。 - CMPS
好的,再猜一次。我对Linux不是很了解,但也许在gcc命令组和filename部分之间加入exit或类似的东西可能会奏效。 - Utkan Gezer
13个回答

43

你尝试过将整个命令写成一个字符串吗?

{
"cmd" : ["gcc $file_name -o ${file_base_name} && ./${file_base_name}"],
"selector" : "source.c",
"shell": true,
"working_dir" : "$file_path"
}

我认为(半推测),ST3将第一个参数视为“程序”,并将其他字符串作为“参数”传递。

https://docs.python.org/2/library/subprocess.html#subprocess.Popen

对这个解决方案很好奇,因为它符合我认为它应该运行的方式。 - Eugene K
谢谢,这确实可以通过设置 shell = true; 来实现。我认为唯一无法解决的问题是从用户那里获取输入。 - CMPS
据我所知,ST3不支持在其构建系统中进行用户输入。 - erbridge
7
如果能帮助未来的程序员避免一些麻烦,我想指出你应该将这个内容放在一个构建系统配置文件中,方法是前往"工具"-"构建系统"-"新建构建系统",而不是偏好设置配置文件(首选项-"设置-更多"-"语法特定")。 - Jerreck
1
编译过程中需要哪些修改才能显示所有可能出现的警告和错误? - Jonath P

28

要实现运行菜单命令的崇高构建系统:

  • 前往工具->构建系统->新建构建系统...

或者

  • 创建一个文件 ~/.config/sublime-text-3/Packages/User/GCC.sublime-build

并添加以下内容:

{
"shell_cmd" : "gcc $file_name -o ${file_base_name}",
"working_dir" : "$file_path",
"variants":
  [
    {
      "name": "Run",
      "shell_cmd": "gcc $file_name -o ${file_base_name} && ${file_path}/${file_base_name}"
    }
  ]
}

*这个例子使用GCC编译器。请随意用您选择的编译器替换gcc


4
经过一番在互联网上的严肃代码搜索,我终于找到了一种方法让你可以在一个专用的终端窗口中一次性编译+运行你的C代码,而且是在C99标准下的。我知道,有些人不喜欢C99,但我也不喜欢某些人。
通常情况下,Sublime会编译和运行代码,但是只能支持C90或更低版本。因此,如果你特别想使用C99,这是正确的方式。 注意:顺便说一句,我在Windows机器上完成了这项工作,但不能保证在其他机器上也能正常工作。 1. 在Sublime中创建一个新的构建系统:工具 > 构建系统 > 新建构建系统... New Build System 2. 将创建一个名为untitled.sublime-build的新文件。 大多数情况下,Sublime会为你打开它。
如果没有,就去首选项 > 浏览程序包 > 用户Open new sublime-build 如果有untitled.sublime-build文件,就打开它;如果没有,就手动创建它并打开它3. 复制并粘贴以下代码到上述的untitled.sublime-build文件中,并保存。
{
    "windows":
    {
        "cmd": ["gcc","-std=c99" ,"$file_name","-o", "${file_base_name}.exe", "-lm", "-Wall", "&","start", "${file_base_name}.exe"]
    },
    "selector" : "source.c",
    "shell": true,
    "working_dir" : "$file_path",
}

关闭文件,你就快完成了!

4. 最后将文件从untitled.sublime-build改名为myC.sublime-build,当然你也可以在这里发挥创意,只需保持文件扩展名相同。

5. 最后当前构建系统设置为前一步中编写的文件名。在这种情况下,它是myC

更新当前构建系统

大功告成!通过工具 > 构建或简单地按下Ctrl + B来使用C99编译并运行您的C代码。


3
我们可以在Sublime Text中编译C代码并打印一些值或字符串,但是它不能从用户接受输入。 (就我所知...我确定编译,但不确定是否能从给定的输入输出。)如果您正在使用Windows,则需要为Sublime Text和GCC编译器设置环境变量。

1
我忘了提到我正在使用Ubuntu 14.04。 - CMPS
仍然...我不认为它有效..我也想在Sublime Text中运行程序..对于这个问题加1..也许有人会给出答案。 - rock321987
1
谢谢,目前我能够使用第一个代码块进行编译,但我的问题在于运行程序。希望有人能提供解决方案(如果可能的话) :) - CMPS

1
最新版的Sublime甚至允许使用直接命令而非双引号。尝试以下代码来构建系统。
{
    "cmd" : ["gcc $file_name -o ${file_base_name} && ./${file_base_name}"],
    "selector" : "source.c",
    "shell": true,
    "working_dir" : "$file_path",
}

1
指示基于“icemelon”帖子。 帖子链接: 如何在Sublime Text 2中编译和运行C程序 使用下面的链接查找如何在您的操作系统上设置环境变量: c_environment_setup 以下说明已在Windows 8.1系统和Sublime Text 3 - build 3065上进行了测试。
1)安装MinGW。 2)将“MinGW \ bin”路径添加到“PATH环境变量”中。
“系统属性 ->高级 ->环境”变量,然后更新“PATH'变量。
3) 然后通过“命令提示符”中的以下命令检查您的PATH环境变量:
echo %path%

4) 将新的构建系统添加到Sublime Text中。

下面是我的代码版本("C.sublime-build")。

代码链接:

C.sublime-build

// Put this file here:
// "C:\Users\[User Name]\AppData\Roaming\Sublime Text 3\Packages\User"
// Use "Ctrl+B" to Build and "Crtl+Shift+B" to Run the project.
// OR use "Tools -> Build System -> New Build System..." and put the code there.

{
    "cmd" : ["gcc", "$file_name", "-o", "${file_base_name}.exe"],

    // Doesn't work, sublime text 3, Windows 8.1    
    // "cmd" : ["gcc $file_name -o ${file_base_name}"],

    "selector" : "source.c",
    "shell": true,
    "working_dir" : "$file_path",

    // You could add path to your gcc compiler this and don't add path to your "PATH environment variable"
    // "path" : "C:\\MinGW\\bin"

    "variants" : [

        { "name": "Run",
          "cmd" : ["${file_base_name}.exe"]
        }
    ]
}

1
最好的方法就是为您的项目使用Makefile,ST3会自动检测您的项目的构建系统。例如,如果您按下shift + ctrl/cmd + B,您将看到以下内容:Make

0
尝试在您的项目文件夹中编写一个名为run.sh的shell脚本。
#!/bin/bash
./YOUR_EXECUTIVE_FILE
...AND OTHER THING

并创建一个构建系统来编译和执行它:

{
      "shell_cmd": "make all && ./run.sh"
}

别忘了 $chmod +x run.sh

专注于一件事,并做到最好 :)


0
如果你编写C或C++语言, 我认为我们很幸运,因为我们可以使用文件进行输入。这非常方便和清晰。我经常这样做。以下是实现它的论点:
{
freopen("inputfile", "r", stdin);
}

请注意,inputfile必须与源代码文件位于同一目录下,r代表读取。

0
你在Linux上使用Sublime Text吗? 我遇到了同样的问题,但已经解决了! 这是我的c.sublime-build文件:
{
 "shell_cmd" : "gcc $file_name -o $file_base_name && ./$file_base_name", 
 "selector" : "source.c",
 "shell":true,
 "working_dir" : "$file_path"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接