7

我一直在尝试为 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
  • 打开“其他”目录中的一个文件并执行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 的 CGrabBuffer )重复相同的操作。在这里,我发现了第一个问题。这两个目标必须是什么类型?我只希望他们生成 .o 文件。
  • 完成后,我键入M-x ede-customize-current-target所有三个目标,并添加一些包含路径、一些库等。
  • 在此之后,如果我调用M-x ede-compile-project它不会编译,因为:
    • 它首先尝试编译 main.cpp;在尝试构建 main.cpp 之前,我不知道如何指定(使用 EDE)Utils.o 和 CGrabBuffer.o 都需要。
    • 如果我手动更改顺序(编辑 Makefile),它无法链接 main.cpp,因为它找不到 Utils.o 和 CGrabBuffer.o。

正如你所看到的,我正处于一团糟之中。也许我什至不理解 EDE 中的“目标”是什么意思。我还阅读了必须在 .emacs 文件中指定的 ede-cpp-root-project 的存在。我没有尝试过,因为我认为它只是帮助语义。它不会生成 Makefile,是吗?我可以拥有(或者我是否需要)一个使用 Project.el 构建的 EDE 项目,以及使用 ede-cpp-root-project 的语义相同的东西吗?或者是多余的?

抱歉,如果我误解了很多东西,但我很困惑,并且刚接触 emacs 会让事情变得更糟。谢谢你的耐心!

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

4

2 回答 2

8

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

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

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

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

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

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

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

编辑:对于给定的项目区域,您只需要一个 EDE 项目。当没有其他自动项目类型起作用时,ede-cpp-root 项目很有用。那是您在 .emacs 文件中创建它的时候,这样其他需要项目定义的工具(例如语义的智能完成和标签查找)就可以工作。

于 2012-02-24T05:09:26.813 回答
3

好吧,我想我这次真的弄明白了,但它很难看。 Utils.cpp并且CGrabBuffer.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. 此时,如果你makeother子目录中运行,你应该得到存档libaux.a

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

6) 使用M-x ede-proj-regenerate.

现在,不幸的是,Makefilemain首先生成目标,然后进入other目录并生成它。不幸的是,这意味着顶级目录中的 make 将无法在干净的树上运行。我不知道为什么会这样,因为在任何使用 EDE 制作的项目中,这似乎永远不会是您想要的。我找不到任何方法来改变它,除了这个黑客:

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

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

我很快就确信 EDE 还没有准备好被其作者以外的人使用。尽管它的大小和他们显然投入了很多努力,但它太有问题了,太违反直觉了,而且还不够聪明。真可惜。Emacs 需要这样的东西。

于 2012-02-23T19:17:23.573 回答