如何为C++创建EDE项目
How to create an EDE project for C++
我一直在尝试为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文件
- 在main.cpp缓冲区上:
- 完成后,我为所有三个目标键入
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.cpp
和CGrabBuffer.cpp
不应该有自己的单独目标,因为似乎没有合适的目标类型。相反,您需要创建一个档案或库,它将自动为您编译Utils.cpp
和CGrabBuffer.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需要这样的东西。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 使用 EDE 处理 emacs 中的 cmake/C++ 项目
- 如何为C++创建EDE项目
- 使用库设置emacs EDE项目