我在学校有一点C编程经验,但这都是Unix。我想用Emacs编译一些C,使用Emacs作为第二个IDE。
最简单的方法是做什么?我在Emacs中没有成功编译helloWorld.c而下载了Cygwin。即使打开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
答案 0 :(得分:4)
我使用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作为编辑器。你也可以从中调用msbuild 命令提示符以构建解决方案。
此外,visual studio命令提示符只调用vcvars.bat(或类似的东西) 建立必要的环境。我想你可能能够修改emacs shell以指向在启动时运行此bat文件的cmd实例?
答案 1 :(得分:3)
您尝试在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风格的windows可执行文件,或者运行mingw的gcc而不是cygwin。
如果你为它或它的make实用程序找到一个合适的命令行,或者你可以从gnu make运行它,大概emacs甚至可以启动Visual Studio编译器。混合和匹配时可能遇到的问题是Windows与unix路径,可执行路径包含必要的工具,以及外部编译器可能以IDE无法解析的方式格式化错误以使其可点击的可能性。所有这些都可以解决(例如,在项目的一个阶段,我有一个sed脚本重新格式化GCC交叉错误,使它们可以在Visual Studio的编译器错误窗口中单击)
答案 2 :(得分:3)
您不需要gcc或cygwin在Windows上编译C代码。
我在emacs 23.2中使用编译器,make实用程序,链接器以及(免费)Microsoft Visual-C ++ Express版本和(免费)Windows SDK附带的其他工具。
一些提示:
(eval-after-load "compile"
'(progn
(setq compilation-scroll-output "first-error")
(setq-default compile-command "nmake ")))
(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))
答案 3 :(得分:2)
我是Emacs,Cygwin Bash和一般C术语的新手,所以我在这个帖子中找到了一些其他解释,其他人对我来说有点困惑。我最终找到了自己的解决方案。对于处于类似情况的人,我希望这些简单的说明有所帮助。如果任何比我更高级的人添加我可以更新这篇文章。
(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。
作为一个例子,编译并执行程序" foo.c"通过Cygwin Bash:
gcc foo.c -o foo.exe
。输出应显示在Emacs shell缓冲区中。这对我来说效果非常好,我希望对于那些不想通过配置Visual Studio或其他解决方案的人来说,这将是一个简单的替代方案。