如何为C ++创建EDE项目

我一直在尝试为C ++(emacs24 +内置CEDET)建立一个EDE项目,我开始变得绝望,因为我似乎无法找到想要生成makefile的方式。 我对Emacs来说比较新。 我会尽力描述我在做什么:

我有一个玩具项目如下设置:

main.cpp
other/
  Utils.cpp 
  Utils.h
  CGrabBuffer.cpp
  CGrabBuffer.h

main.cpp在“other /”目录中包含两个.h。 这些是我通过这个简单的目录设置来设置EDE项目的步骤:

  • 在emacs中打开main.cpp并执行Mx ede-new ; 类型: Make ; 名称: main-proj
  • 打开“其他”目录中的一个文件并执行Mx ede-new ; 类型: Make ; 名称: aux-proj
  • 现在是创建目标的时候了(在这种情况下我认为这是三个):
  • 在main.cpp缓冲区中: Mx ede-new-target ; 名称: main ; 键入: program 。 当提示时,我将main.cpp添加到此目标。
  • 我对其他两个目标(具有Utils.cpp和Utils.h的Utils以及具有CGrabBuffer.cpp和CGrabBuffer.h的CGrabBuffer)重复相同的操作。 在这里我找到了第一个问题。 这两个目标必须是什么类型? 我只希望他们生成.o文件。
  • 一旦完成,我为所有三个目标键入Mx ede-customize-current-target ,并添加一些包含路径,一些库等。
  • 在此之后,如果我调用Mx ede-compile-project它不会编译,因为:
  • 它试图首先编译main.cpp; 在尝试构建main.cpp之前,我不知道如何指定(使用EDE)需要使用Utils.o和CGrabBuffer.o。
  • 如果我手动更改顺序(编辑Makefile),它无法链接main.cpp,因为它找不到Utils.o和CGrabBuffer.o。
  • 正如你所看到的,我陷入了一团糟。 也许我甚至都不明白EDE中的“目标”是什么意思。 我还读过了ed​​e-cpp-root-project的存在,它必须在.emacs文件中指定。 我没有尝试过,因为我认为它只是帮助语义。 它不生成Makefiles,是吗? 我可以有(或者我需要)使用ede-cpp-root-project作为语义的Project.el构建的EDE项目吗? 或者是多余的?

    对不起,如果我误解了很多东西,但是我很困惑,并且对emacs感到陌生,这会让事情变得更糟。 谢谢你的耐心!

    编辑:有一些修补和我收到的答复我已经能够找出很多东西,所以非常感谢。 我仍然不明白的是使用必须在.emacs文件中指定的ede-cpp-root-project。 它只是为了c ++语义吗? 使用Project.el的项目以及.emacs中的elisp项目是否多余?


    EDE旨在处理许多不同类型的项目,通常是在其他工具中使用Emacs编写构建系统的类型。

    为您创建Makefiles的EDE项目类型可以做很多事情,但您需要对构建系统有一些基本的了解才能有所帮助,而且您确实需要自定义项目以获取任何复杂的工作。

    我最近在EDE手册中添加了一个部分,以帮助您自动生成Automake文件的基本项目设置。 你可以在这里查看教程:

    http://www.randomsample.de/cedetdocs/ede/ede/Quick-Start.html

    相同的步骤将适用于只使用Make的项目,但由于额外的复杂性,基于Make的项目通常会遇到共享库的问题。

    Mike的回答非常好,但我认为只需将.h文件添加到与.cpp源相同的目标即可。 它会分开跟踪它们。

    另一个有用的技巧是使用整个项目编译按键(Cc。C),只要你改变一些大的东西,它就会使用大写字母C. 这将重新生成Makefiles,重新运行任何所需的Automake功能,并从顶部开始。

    编辑 :你只需要一个EDE项目给一个项目区域。 当没有其他自动项目类型工作时,ede-cpp-root项目很有用。 这就是当你在你的.emacs文件中创建它时,需要项目定义的其他工具,如语义的智能完成和标记查找等。


    好吧,我想这次我已经想通了,但这很丑。 Utils.cppCGrabBuffer.cpp不应该得到他们自己的单独目标,因为似乎没有合适的目标类型。 相反,您需要创建一个归档或库,它会自动为您编译Utils.cppCGrabBuffer.cpp 。 下面,我假设你想要静态,但很容易改变。

    [对于档案馆或图书馆不熟悉的任何人,他们基本上只是将.o文件收集到一个单独的单元中。 它实际上并没有使编辑更难。 在这里阅读更多。]

    1)按照上面的前两步(包括制定main目标,但不包括其他目标)。

    2)切换到Utils.cpp并执行Mx ede-new-target ede Mx ede-new-target ; 名称: aux ; 键入: archive 。 出现提示时,将Utils.cpp添加到此目标。

    3)切换到CGrabBuffer.cpp并做Cc . a Cc . a ; 目标: aux

    4)用Mx ede-proj-regenerate重新生成Makefile。 此时,如果您在other子目录中运行make ,则应该获得存档libaux.a

    5)切换回main.cpp并执行Mx ede-customize-current-target 。 这会产生一个交互式emacs自定义缓冲区,它允许您编辑ede配置的详细信息。 在Ldflags部分下,单击[INS] 。 这会弹出一个表示Link Flag:的新行Link Flag:并且有一些不同颜色的框供您输入(我的是灰色的)。 键入-Lother -laux ,以便在编译main时包含other/libaux.a 。 然后,在缓冲区的顶部,按[Accept] ,它应保存该更改并切换回main.cpp。

    6)用Mx ede-proj-regenerate重新生成Makefile。

    现在,不幸的是,Makefile首先将main目标设main目标,然后进入other目录并做到这一点。 不幸的是,这意味着顶层目录下的make不能在干净的树上工作。 我不知道这是为什么,因为这似乎永远不会成为您用EDE制作过的任何项目中的所需。 我找不到任何方法来改变这种情况,除了这个黑客:

    7)做Mx customize-project ; 在Inference-Rules单击[INS] 。 然后输入Target: all ; 相关性: aux main ; 规则: [INS] ; 字符串@: (这最后一个只是为了防止在带有选项卡的空规则上出现错误;大概是一个EDE错误。)单击[Accept] ,然后重新生成Makefiles。

    所以现在,在你的顶级目录中,你可以运行make,而main应该是一个可执行的工作文件。

    我很快就确信EDE尚未准备好被其他作者使用。 尽管它的大小和他们已经明确地投入其中的努力量,但它太麻烦了,太违反直觉,并且不够聪明。 这太遗憾了。 Emacs需要这样的东西。

    链接地址: http://www.djcxy.com/p/62179.html

    上一篇: How to create an EDE project for C++

    下一篇: The equivalent of a GUI "Quick Open" in Emacs on CLI?