如何为C++创建EDE项目

How to create an EDE project for C++

本文关键字:EDE 项目 创建 C++      更新时间:2023-10-16

我一直在尝试为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并执行M-x ede-new;类型:Make;名称:main-proj
  • 打开"other"目录中的一个文件,执行M-x ede-new;类型:Make;名称:aux-proj
  • 现在是时候制定目标了(我认为在这种情况下有三个):
    • 在main.cpp缓冲区上:M-x ede-new-target;名称:main;类型:program。当提示时,我将main.cpp添加到此目标
    • 我对其他两个目标重复同样的操作(具有Utils.cpp和Utils.h的Utils,以及具有CGrabBuffer.cpp和CGrabBuffer.h的CGrabCache)。在这里我发现了第一个问题。这两个目标必须是什么类型?我只想让它们生成.o文件
  • 完成后,我为所有三个目标键入M-x ede-customize-current-target,并添加一些包含路径、一些库等
  • 之后,如果我调用M-x ede-compile-project,它就不会编译,因为:
    • 它尝试先编译main.cpp;我不知道如何指定(使用EDE)在尝试构建main.cpp之前需要Utils.o和CGrabBuffer.o
    • 如果我手动更改订单(编辑Makefile),它将无法链接main.cpp,因为它找不到Utils.o和CGrabBuffer.o

正如你所看到的,我正处于一个巨大的混乱之中。也许我甚至不明白"目标"在EDE中的含义。我还读到了ede-cpp根项目的存在,该项目必须在.emacs文件中指定。我还没有尝试过,因为我认为它只是在语义方面有所帮助。它不会生成Makefile,是吗?我可以(或者我需要)一个用project.el构建的EDE项目吗?或者它是多余的?

对不起,如果我误解了很多事情,但我很困惑,对emacs来说是个新手会让事情变得更糟。谢谢你的耐心!

编辑:经过一些修改和我收到的回复,我已经弄清楚了很多东西,所以非常感谢。我仍然不明白的是ede-cpp根项目的使用,它必须在.emacs文件中指定。它只是用于c++语义吗?有project.el的AND和.emacs中的elisp行的项目是多余的吗?

EDE被设计用于处理许多不同类型的项目,通常是在Emacs之外的其他工具中编写构建系统的类型。

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

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

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

同样的步骤也适用于只使用Make的项目,但由于额外的复杂性,基于Make的工程通常在共享库方面遇到问题。

Mike的回答很好,但我认为可以将.h文件添加到与.cpp源相同的目标中。它将分别跟踪它们。

另一个有用的技巧是使用整个项目的编译击键(C-C.C),每当你更改一些大的东西时,它都会使用大写的C。这将重新生成Makefile,重新运行任何需要的Automake功能,并从顶部开始。

编辑:对于给定的项目区域,您只需要一个EDE项目。当没有其他自动项目类型工作时,ede-cpp根项目非常有用。这时,您可以在.emacs文件中创建它,以便其他需要项目定义的工具(如语义的智能完成和标记查找)能够工作。

嗯,我想这次我真的想明白了,但它很难看。Utils.cppCGrabBuffer.cpp不应该有自己的单独目标,因为似乎没有合适的目标类型。相反,您需要创建一个档案或库,它将自动为您编译Utils.cppCGrabBuffer.cpp。下面,我假设您想要静态的,但很容易更改。

[对于那些不熟悉档案馆或图书馆的人来说,他们基本上只是将.o文件收集到一个单独的单元中。这实际上并没有使编译变得困难。点击此处阅读更多信息。]

1) 遵循上面的前两个半步骤(包括使main成为目标,但不包括其他目标)。

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

3) 切换到CGrabBuffer.cpp并执行C-c . a;目标:aux

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

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

6) 使用M-x ede-proj-regenerate重新生成Makefile。

现在,不幸的是,Makefile首先使main成为目标,然后下降到other目录中并使其成为目标。不幸的是,这意味着来自顶级目录的make将无法在干净的树上工作。我不知道为什么会这样,因为在任何使用EDE的项目中,这似乎都不是你想要的。我找不到任何方法来改变这一点,除了这个黑客:

7) 做M-x customize-project;在"Inference-Rules"下,单击"[INS]"。然后输入目标:all;依赖项:aux main;规则:[INS];字符串@:。(最后一个只是为了防止带有选项卡的空规则出错;可能是EDE错误。)单击[Accept],重新生成Makefiles。

因此,现在,在您的顶级目录中,您只需运行make,main应该是一个可运行的可执行文件。

我很快就确信,EDE还没有准备好被作者以外的人使用。尽管它的规模和他们显然投入了大量的精力,但它太bug,太违反直觉,而且不够聪明。真遗憾。Emacs需要这样的东西。