Ver*_*gen 5 c++ linker compilation build
我是一名Java开发人员,我从不担心包含文件或搞乱BUILD文件.
每当我需要编写C++代码时,事情变得更加复杂.我可以考虑在Java中创建*.h文件作为接口,但是弄清楚如何编写构建文件以及应该包含哪些订单类让我头疼.
有没有一种简单的方法来考虑这个?你怎么知道何时包含某些东西或如何正确地分开东西.例如,通常使用几个相互依赖的源文件来处理项目的好方法.
是否有一些框架可以创建BUILD文件或管理所有这些样板编译的东西更可忍受?
CMake是迄今为止我能找到的最好的构建系统.您给它一个源文件列表,它将自动扫描依赖项并重新编译已更改的文件.虽然它的语法有点滑稽,并且文档不易访问,但CMake在可用性和简单性方面胜过GNU autotools,并且它适用于所有主要平台.
关于你正在发生的事情的"心理模型",这里有一些要记住的要点.
一个.cpp文件是完全独立于其他编译.cpp文件.
该.cpp文件是由编译器读取从上到下,只有一次.因此,事情需要按照正确的顺序进行.
一个#include指令是一样的复制/粘贴头到.cpp文件中.
在使用函数时,需要声明该函数,但不一定是定义.
在访问类成员时,需要该类的定义.从类中派生也需要它的定义.使用指针或引用不需要定义,但需要声明.在标题中使用这个优势:而不是包含Foo.hpp,看看你是否可以逃脱声明class Foo;.
编译.cpp文件时,.o会生成一个文件,其中包含完全正确定义的函数的实现.cpp.对未在其中定义的函数的引用留给链接器解析.
链接器将所有这些定义放在一个可执行文件中,但每个函数定义必须只存在一次.(模板和内联函数是一个例外.)