如何理解C++链接/依赖关系?

Ver*_*gen 5 c++ linker compilation build

我是一名Java开发人员,我从不担心包含文件或搞乱BUILD文件.

每当我需要编写C++代码时,事情变得更加复杂.我可以考虑在Java中创建*.h文件作为接口,但是弄清楚如何编写构建文件以及应该包含哪些订单类让我头疼.

有没有一种简单的方法来考虑这个?你怎么知道何时包含某些东西或如何正确地分开东西.例如,通常使用几个相互依赖的源文件来处理项目的好方法.

是否有一些框架可以创建BUILD文件或管理所有这些样板编译的东西更可忍受?

Tho*_*mas 8

CMake是迄今为止我能找到的最好的构建系统.您给它一个源文件列表,它将自动扫描依赖项并重新编译已更改的文件.虽然它的语法有点滑稽,并且文档不易访问,但CMake在可用性和简单性方面胜过GNU autotools,并且它适用于所有主要平台.

关于你正在发生的事情的"心理模型",这里有一些要记住的要点.

  • 一个.cpp文件是完全独立于其他编译.cpp文件.

  • 该.cpp文件是由编译器读取从上到下,只有一次.因此,事情需要按照正确的顺序进行.

  • 一个#include指令是一样的复制/粘贴头到.cpp文件中.

  • 在使用函数时,需要声明该函数,但不一定是定义.

  • 在访问类成员时,需要该类的定义.从类中派生也需要它的定义.使用指针或引用不需要定义,但需要声明.在标题中使用这个优势:而不是包含Foo.hpp,看看你是否可以逃脱声明class Foo;.

  • 编译.cpp文件时,.o会生成一个文件,其中包含完全正确定义的函数的实现.cpp.对未在其中定义的函数的引用留给链接器解析.

  • 链接器将所有这些定义放在一个可执行文件中,但每个函数定义必须只存在一次.(模板和内联函数是一个例外.)