【问题标题】:Compiling C++ Programs with Emacs on Windows在 Windows 上使用 Emacs 编译 C++ 程序
【发布时间】:2009-04-11 21:47:16
【问题描述】:

我已经使用 Emacs 进行基本的文本编辑已经有一段时间了,但到今天为止,我正尝试将它用于 c++ 编译。在过去的几个小时里,我一直在寻找如何解决这个问题,但我一直在他们的技术上遇到障碍(我认为其中一些与教程过时有关)。

基本上,我想做的就是能够通过“M-x compile”命令编译我在 Emacs 中编写的 C++ 程序。

到目前为止,我已经安装了 Cygwin 并下载了 gcc 的软件包。我尝试了在线教程提供的其他一些解决方案,但没有成功。

谢谢。

【问题讨论】:

    标签: c++ emacs gcc ide


    【解决方案1】:

    安装编译器后。可以使用如下 sn -p 自定义编译命令

    (add-hook 'c++-mode-hook
      (lambda ()
        (unless (file-exists-p "Makefile")
          (set (make-local-variable 'compile-command)
           (let ((file (file-name-nondirectory buffer-file-name)))
             (concat "g++ -g -O2 -Wall -o " 
                 (file-name-sans-extension file)
                 " " file))))))
    

    【讨论】:

      【解决方案2】:

      M-x compile 命令调用 shell(例如 linux bash、windows cmd.exe 等)来运行 make 命令。在 Windows 上,我认为 emacs 默认为 cmd.exe shell(通过特殊的 C:/Program Files/Emacs/emacs/bin/cmdproxy.exe 可执行文件)。

      如果您希望您的 M-x compile 使用不同的 shell(在您的情况下可能是 cygwin bash),那么您需要通过更改 shell-file-name 变量或使用 SHELL 环境变量来告诉 emacs。您还需要确保通过更改 exec-path 变量(或使用 PATH 环境变量)找到 cygwin make

      为此:

      (setq shell-file-name "C:/cygwin/bin/bash.exe") 
      (setq exec-path (cons "C:/cygwin/bin" exec-path))
      

      您还可以查看 setup-cygwin.el 来设置它以及为 cygwin 做一些其他事情。

      【讨论】:

      • 这非常适合将默认 shell 切换到 bash,但由于某种原因,当我尝试执行它们时找不到 make 或 gcc 命令。
      • 将 cygwin 的 /usr/bin 添加到你的 Windows PATH 中?
      【解决方案3】:

      您可以尝试MinGW - "Minimalist GNU for Windows." 我不记得如何配置 emacs 以从 M-x compile 调用自定义构建工具,但它应该是可能的。这是我刚刚遇到的一个链接,它可能是一个起点。

      http://www.cae.tntech.edu/help/programming/free-programming-tools-windows

      【讨论】:

      • 默认情况下,Emacs 会使用 M-x compile 调用 make,并且可以使用 MinGW 安装 make。如果我没记错的话,唯一的问题是make的可执行文件实际上没有命名为make,你必须重命名它。
      【解决方案4】:

      按照 Emacs 文档的建议,为您的程序编写一个 Makefile 并使用“make -k”作为“M-x compile”。一般来说,使用make(或类似的构建工具)比为 GCC 重新键入命令行更好,而不仅仅是 Emacs。

      【讨论】:

      • 执行 make 命令时,我不断收到错误消息“start-process-shell-command: Spawning child process: invalid argument”。我试过同时使用“make -k exercise”和“make exercise”都给出同样的错误。
      • 当我在正常的 cmd 窗口中输入它时它可以工作,但是如果我尝试通过 emacs m-x shell 命令运行 make 它无法识别 make 命令。
      • 尝试在 Makefile 中添加一行设置 SHELL 变量,例如“SHELL = /usr/bin/sh”。参考:lists.ccs.neu.edu/pipermail/prl/2008q2/002087.html
      • 只要您的路径中有 MingW32-g++ 可执行文件,并且您正在编译的文件的文件夹中有 Makefile,那么只需 M-x compile 即可。更改 PATH 变量并重新启动后,您是否尝试过关闭 emacs?你需要这样做。
      【解决方案5】:

      如果你在 Cygwin 中安装 Emacs 和 g++,它应该像 Linux 一样工作,也就是说你可以运行 M-x compile 并使用 g++ myFile.cpp 作为你的编译命令。如果您在 Windows 上使用“本机”Emacs,或者混合使用 Cygwin/MinGW/etc,事情会变得有点复杂(其他答案有解决方案),但归根结底是确保您的环境变量设置正确(例如 PATH、SHELL 等)。最终,如果你不能在命令行上运行它(无论是来自 Cygwin 或 MinGW 的 cmd.exe 或 /bin/bash),它就不能在任何 Emacs 中运行。

      例如,我在 Emacs 中使用来自 Cygwin 的 SCons/g++ 和来自 MS Visual Studio 的 devenv.com 编译 C++。这当然需要安装 SCons 和 Visual Studio,但这是可能的。 SCons 从 Cygwinports (http://sourceware.org/cygwinports/) 安装并最终位于标准路径中的 /usr/bin 中,但 devenv.com 深埋在 Visual Studio 中;为了访问它,我将它的包含目录添加到我的 PATH(在我的 ~/.bash_profile 中):

      case $OS in
          Windows_NT)
              case "`uname -s`" in
                  CYGWIN_NT*)
                      PATH=${PATH}:"/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/"
                      ;;
                  MINGW32_NT*)
                      PATH=${PATH}:"/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/"
                      ;;
              esac
      esac
      

      然后我构造了一个sconsdevenv.com -build "Release|Platform MySolution.sln 的编译命令,然后一切顺利。您可以根据需要变得复杂(在我当前的项目中,我已经构建和测试了调用 sconsdevenv.com 的 shell 脚本;我倾向于避开批处理文件,因为 shell 更强大)。我唯一的抱怨是微软改变了错误的输出,因此从编译器输出自动跳转到代码行目前被破坏了(我需要考虑修复它)。

      我假设您来自 Emacs 的“本机”构建,在这种情况下,您可能还会发现适用于 Emacs 的 cygwin-mount 模块。

      【讨论】:

        猜你喜欢
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-29
        • 2018-11-28
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多