【问题标题】:How to get your head around C++ linking/dependencies?如何了解 C++ 链接/依赖项?
【发布时间】:2011-03-29 19:32:47
【问题描述】:

我是一名 Java 开发人员,我永远不必担心包含文件或弄乱 BUILD 文件。

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

有没有一种简单的方法来思考这个问题?您如何知道何时包含某些内容或如何正确地将其分开。例如,处理具有数十个相互依赖的源文件的项目通常是一种好方法。

是否有一些框架可以让创建 BUILD 文件或管理所有这些样板编译内容变得更容易忍受?

【问题讨论】:

  • 你在哪个平台上? BUILD 文件是什么意思?您是指实现文件(函数定义所在的位置)还是编译器为开关、包含、库路径和其他内容读取的文件?
  • 这是你觉得难的吗? g++ -c unit1.c -I /include_path/ ; g++ -o 可执行文件 *.o -L /library_path/
  • 什么是构建文件?而你所指的“应该包含哪些订单类让我很头疼。”。构建文件,还是包含在 h/cpp 中?
  • 我的separate compilation in a nutshell 可能会开始回答你一半的问题(在你开始提到构建系统之前,单独编译是一个很大的话题)。

标签: c++ build linker compilation


【解决方案1】:

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

至于您对正在发生的事情的“心理模型”,请记住以下几点。

  • .cpp 文件的编译完全独立于其他 .cpp 文件。

  • 编译器从上到下读取.cpp 文件,只读取一次。因此,事情需要按正确的顺序排列。

  • #include 指令与将标头复制/粘贴到 .cpp 文件中相同。

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

  • 在访问类成员时,需要类的定义。从一个类派生也需要它的定义。获取指针或引用不需要定义,但需要声明。在标题中利用这一点:不要包含Foo.hpp,而是看看是否可以只声明class Foo;

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

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

【讨论】:

    【解决方案2】:

    我是 stackoverflow 播客的忠实粉丝,我决定在使用构建系统时应该使用 FinalBuilder。

    Jeff Atwood 和 Joel Spolsky 就此进行了一次对话,并提到它用于 Fog Creek。

    播客是here

    FinalBuilder 是 here

    Feature Tour

    我希望它适合这个目的。

    它适用于 Windows 平台。

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 2018-05-12
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多