在 windows 系统上用 Emacs 编译 C

Posted

技术标签:

【中文标题】在 windows 系统上用 Emacs 编译 C【英文标题】:Compiling C with Emacs on windows system 【发布时间】:2011-06-01 04:18:05 【问题描述】:

我在学校有一点 C 编程经验,但都是 Unix。我想用 Emacs 编译一些 C,使用 Emacs 作为第二个 IDE。

最简单的方法是什么?我下载了 Cygwin,但没有在 Emacs 中成功编译 helloWorld.c。即使打开 cygwin 命令提示符(shell 或其他任何名称),它也不会将 gcc 识别为命令。

错误 'make' 不是内部或外部命令、可运行程序或批处理文件。

我需要一个可以在 Windows 上运行的编译器,它是免费的(或带有 Visual Studio 的),并且可以与 Emacs 一起使用。在M-x compile 命令之后在 Emacs 中输入什么也很高兴知道。我查看了 MinGW,但下载它是一件苦差事。

我希望这个问题有意义。我经常迷失在开源世界中。

环境 Windows XP、Visual Studio 2010、Emacs 23.2.1、已安装 Windows 7.1 SDK、Cygwin

【问题讨论】:

【参考方案1】:

我使用 Visual Studio 作为编译器,使用 emacs 作为编辑器。

只需安装 Visual Studio C++ 2010 Express Edition。 然后我要做的是编写一个 nmake Makefile 并从中调用 nmake Visual Studio 命令提示符(可从“程序”菜单访问)。 这适用于较小的项目。

见http://msdn.microsoft.com/en-us/library/f35ctcxw.aspx 了解更多详情。

对于较大的项目,您可以在 Visual Studio 中创建解决方案并 只需使用 emacs 作为编辑器。您还可以从 命令提示符来构建解决方案。

此外,Visual Studio 命令提示符只是调用 vcvars.bat(或类似的东西) 设置必要的环境。我猜你也许可以修改 emacs shell 以指向一个在启动时运行这个 bat 文件的 cmd 实例?

【讨论】:

如果不使用IDE,不妨安装Windows SDK;它在工具方面比快速版功能更完整。 我也安装了 windows sdk :) Mackey - 您可以在 Emacs 中使用 M-x compile 调用 nmake.exe。提到的“Visual Studio 命令提示符”Brian Coleman 只是设置了 PATH、INCLUDE 和 LIB 环境变量以允许工具正常工作。您可以自己在系统范围的环境变量中设置这些,就像在 Unix 上一样。 关于搭建必要的环境,this might help.【参考方案2】:

您尝试在 Windows 上执行的任何此类操作都将成为“苦差事”,因为您正在尝试将来自不同来源的组件组合在一起。如果您想要简单,请使用打包在一起的 IDE 和编译器,例如 Visual Studio 免费赠品版,或 Code Blocks,或 Dev C++ 等。

我的理解是 M-x 编译提示正在寻找一个 shell 命令,在 emacs 运行的 shell 的路径中,你当然可以在某个地方设置。根据你为 windows 构建的 emacs,默认情况下可能是 windows shell,或者它可能是 MINGW 或 cygwin 下的 bash。

要在 cygwin 下获取 gcc 和 make 等,您必须从 cygwin 软件包中选择这些进行安装(有效地使用 cygwin 安装程序本身就是一项晦涩难懂的技能)。 Cygwin 的 gcc 将默认编译依赖于 cygwin dll 的东西,但您也可以使用 -mno-cygwin 标志为 gcc 或通过运行 mingw 的 gcc 而不是 cygwin 来制作 mingw 样式的 windows 可执行文件。

如果您找到合适的命令行或其 make 实用程序,或者您可以从 gnu make 运行它,那么 emacs 甚至可以启动 Visual Studio 编译器。混合和匹配时您可能会遇到的问题是 windows 与 unix 路径,让您的可执行路径包含必要的工具,以及外部编译器可能以 IDE 无法解析以使其可点击的方式格式化错误的可能性.所有这些事情都可以解决(例如,在项目的一个阶段,我有一个 sed 脚本,它重新格式化了 GCC 交叉错误,使它们可以在 Visual Studio 的编译器错误窗口中单击)

【讨论】:

你和布赖恩所说的结合起来非常接近我正在寻找的东西。你知道如何更改“emacs 运行的 shell 的路径”吗? 奇怪的是,我没有看到对此的明确自定义 - 您可以轻松更改 M-x shell 运行的 shell,但这似乎不会影响 M-x 编译。所以你可能需要做一些 emacs lisp 来改变 M-x 编译本身的行为。如果您按照 Brian 的建议使用 Visual Studio 的编译和制作,这可能不是问题,因为它们可能可以从 Emacs 选择的任何 shell 运行。您还可以编写一个 .bat 文件来运行其他东西并传递命令行参数。 Mackey - 只需使用系统环境变量对话框(在控制面板中)来设置您的路径(如果您打算使用 C/C++ 编译器,还可以设置您的 INCLUDE 和 LIB),以引用 VS2010 目录。在命令提示符下使用START "Environment" RUNDLL32.exe SHELL32.dll,Control_RunDLL "sysdm.cpl",,3 执行此操作您可能必须在设置这些环境变量后退出 emacs 并重新启动。【参考方案3】:

在 Windows 上编译 C 代码不需要 gcc 或 cygwin。

我使用 emacs 23.2 中(免费)Microsoft Visual-C++ Express 版本和(免费)Windows SDK 附带的编译器、make 实用程序、链接器和其他工具。

给你的一些提示:

在您的 .emacs 文件中使用它: (eval-after-load "compile" '(progn (setq compilation-scroll-output "first-error") (setq-default compile-command "nmake ")))
将适当的错误消息 regexii 添加到编译错误 regexp 列表中。 像这样:
    (mapcar

     (lambda (x)
       (add-to-list 'compilation-error-regexp-alist-alist x))

     (list
     ;; Microsoft C/C++:
     ;;  keyboard.c(537) : warning C4005: 'min' : macro redefinition
     ;;  d:\tmp\test.c(23) : error C2143: syntax error : missing ';' before 'if'
     ;;  .\cppcli1.cpp(36): error C2059: syntax error : 'public'
     ;;  e:\projects\myce40\tok.h(85) : error C2236: unexpected 'class' '$S1'
     ;;  myc.cpp(14) : error C3149: 'class System::String' : illegal use of managed type 'String'; did you forget a '*'?
     ;;   ("\\(\\([a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\)) ?\: \\(error\\|warning\\) C[0-9]+:" 1 3)
      '(msvc "^[ \t]*\\([A-Za-z0-9\\.][^(]*\\.\\(cpp\\|c\\|h\\)\\)(\\([0-9]+\\)) *: +\\(error\\|fatal error\\|warning\\) C[0-9]+:" 1 3)

    ))

    (setq compilation-error-regexp-alist
      (mapcar 'car compilation-error-regexp-alist-alist))

【讨论】:

【参考方案4】:

我是 Emacs、Cygwin Bash 和通用 C 术语的新手,因此我发现此线程中的一些其他解释和其他一些解释让我难以理解。我最终自己找到了解决方案。对于那些处于类似情况的人,我希望这些简单的说明有所帮助。如果比我更高级的人有补充要添加,我可以更新这篇文章。

    安装 Cygwin。 在设置屏幕上进入“devel”文件夹。如果尚未将其下载到 Cygwin 设置中,请选择“gcc-core”。完成安装。 安装 Emacs。 找到 .emacs 文件(Emacs 配置文件,我位于 Emacs 主文件夹中)并添加以下内容:

(setq explicit-shell-file-name "Path to Cygwin folder\\Cygwin.bat") (setq shell-file-name "bash") (setenv "SHELL" shell-file-name)

在指示的位置设置您自己的 Cygwin.bat 路径。请注意,您必须使用 Cygwin.bat。如果您直接访问 bash.exe,它似乎不起作用。此外,您可能需要使用双反斜杠来使转义字符起作用,否则 Emacs 可能会在启动时报错。

现在您可以通过进入 Emacs 并输入 M-x shell 来测试它是否有效。它应该在新缓冲区中打开 Cygwin bash shell。

例如,通过 Cygwin Bash 编译并执行程序“foo.c”:

    编译:gcc foo.c -o foo.exe。这将构建文件并生成具有相同名称的可执行文件。 执行:./foo.exe。输出应该显示在 Emacs shell 缓冲区中。

这对我来说效果很好,我希望这对于那些不想通过配置 Visual Studio 或其他解决方案的人来说是一个简单的选择。

【讨论】:

以上是关于在 windows 系统上用 Emacs 编译 C的主要内容,如果未能解决你的问题,请参考以下文章

在 linux 上用 Eclipse 交叉编译,在 windows 上用 eclipse 交叉编译?

在 Windows 7 上从 emacs 运行 nmake

Windows7上用VS编译本地使用的live555

3.Emacs快速入门之窗格

Emacs的安装配置和使用

windows系统,安装Jenkins,连接Gitlab失败。已经配置了SSH(Windows上用的 cygwin)。错误详见图。