如何为C ++创建EDE项目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为C ++创建EDE项目相关的知识,希望对你有一定的参考价值。
我一直在尝试为C ++设置一个EDE项目(emacs24 +内置CEDET),我开始变得绝望,因为我似乎无法找到我希望生成makefile的方式。我对Emacs比较陌生。我会试着描述一下我在做什么:
我有一个像这样的玩具项目:
main.cpp
other/
Utils.cpp
Utils.h
CGrabBuffer.cpp
CGrabBuffer.h
main.cpp在“other /”目录中包含.h's。以下是使用此简单目录设置设置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具有Utils.cpp和Utils.h以及具有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中“目标”的含义。我还读到了ede-cpp-root-project的存在,它必须在.emacs文件中指定。我没有尝试过,因为我认为它只是帮助语义。它不会生成Makefile,是吗?我是否可以(或者我需要)使用Project.el构建的EDE项目和使用ede-cpp-root-project进行语义相同的事情?还是多余的?
抱歉,如果我误解了很多东西,但我很困惑,对emacs不熟悉会让事情变得更糟。谢谢你的耐心!
编辑:通过一些修补和我收到的回复,我已经能够找出很多东西,所以非常感谢。我还不明白的是使用ede-cpp-root-project,它必须在.emacs文件中指定。它只是用于c ++语义吗?使用Project.el的项目和.emacs中的elisp行是否是多余的?
EDE旨在处理许多不同类型的项目,通常是一种类型,其中构建系统是在Emacs之外的其他工具中编写的。
为您创建Makefile的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-root项目很有用。那是在你的.emacs文件中创建它时,以便需要项目定义的其他工具,如语义的智能完成和标记查找,将起作用。
嗯,我想我实际上已经弄清楚了这一次,但它很难看。 Utils.cpp
和CGrabBuffer.cpp
不应该得到他们自己的目标,因为似乎没有合适的目标类型。相反,您需要创建一个存档或库,它将自动为您编译Utils.cpp
和CGrabBuffer.cpp
。下面,我假设你想要静态,但它很容易改变。
[对于档案馆或图书馆不熟悉的任何人,他们基本上只是将.o
文件收集到一个单独的单元中。它实际上并没有使编译更难。阅读更多here。]
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。此时,如果你在make
子目录中运行other
,你应该获得存档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
重新生成Makefile。
现在,不幸的是,Makefile首先制作main
目标,然后进入other
目录并制作它。不幸的是,这意味着顶级目录中的make不能在干净的树上运行。我不知道为什么会这样,因为在任何用EDE制作的项目中,似乎永远不会是你想要的。除了这个黑客之外,我找不到任何改变方法:
7)做M-x customize-project
;在Inference-Rules
下点击[INS]
。然后输入Target:all
;依赖关系:aux main
;规则:[INS]
;字符串@:
。 (最后一个是为了防止带有制表符的空规则出错;可能是EDE错误。)单击[Accept]
,然后重新生成Makefile。
现在,在您的顶级目录中,您可以只运行make,main
应该是一个可用的可执行文件。
我很快就确信EDE尚未准备好被作者以外的人使用。尽管它的大小和他们已经明确投入的努力量,它太过马车,太违反直觉,而且不够聪明。真是太遗憾了。 Emacs需要这样的东西。
以上是关于如何为C ++创建EDE项目的主要内容,如果未能解决你的问题,请参考以下文章