【问题标题】:Reuse C++ Header files重用 C++ 头文件
【发布时间】:2010-06-06 08:21:05
【问题描述】:

我有一个带有 2 个项目 AlgorithmAAlgorithmB 的 Visual C++ 解决方案,并且它们都与类声明共享一个公共头文件 RunAlgo.h .解决方案中的每个项目都有自己独特的头文件实现。

我正在尝试从公共头文件 RunAlgo.h 中编译一个 DLL 并在项目 AlgorithmAAlgorithmB 中添加对此 DLL 的引用强>。然后,我在两个项目中都包含了单独的 RunAlgo.cpp 定义文件。问题是我在编译只有头文件的新 DLL 项目时遇到链接器错误。

所以,问题是

  1. 是否可以将只有类声明的头文件编译成 DLL(类似于 C# 中包含接口的类库)?
  2. 对于上述场景,有没有更好的方法来复用项目间的通用头文件?
  3. 上述方法是否可行(重新检查我的代码?)

【问题讨论】:

    标签: c++ file dll header


    【解决方案1】:

    1 & 3:不,这在 C++ 中没有意义。

    库(动态或其他)仅在链接期间使用。在编译期间,声明必须以源代码形式对编译器可见。这就是为什么,例如,除了链接到标准库之外,您还必须显式地#include 标准库头文件。

    2:您已经在做的基本上是唯一的解决方案。将公共头文件放在各自的目录下,并将该目录添加到两个项目各自的包含路径中。

    【讨论】:

    • 为了给出一个概述,我正在为优化问题定义基类。有多种实现正在开发中,我想保持一致性,我想用接口声明创建一个 DLL,并将其传递给各个开发团队以继承。如果我是对的,C++ 中唯一的解决方案是将 BaseClass.H 文件传递​​给每个团队。
    【解决方案2】:

    头文件可以只有类吗 声明被编译成 DLL

    不,标头通常只包含声明。编译时的声明不会产生任何机器代码,因此生成的 DLL 将为空。

    对于上述场景,是否存在 更好的方法来重用共同点 项目之间的头文件?

    重用标头很好。事实上,每个库都有一组头文件,您需要将这些头文件包含在使用该库的项目中。

    我不太了解 Visual C++,但我认为您可以制作第三个项目,包含公共部分(即 RunAlgo.h 标头),并将其标记为 AlgorithmAAlgorithmB 项目的依赖项。

    【讨论】:

      【解决方案3】:

      到 1.:

      不,独立的头文件永远不会以 dll 结尾。头文件包含在实现文件中,这就是它们的编译方式。如果您希望允许第三方链接头文件,通常会与 dll 或库一起分发头文件。

      到 2.:

      为什么不声明一个带有算法接口的抽象基类,并通过定义从基类派生的两个子类(AlgorithmA 和 AlgorithmB)来提供两种不同的实现?我不明白你为什么要使用不同的 DLL。

      到 3.:

      不,不应该。见第 1 点。

      【讨论】:

      • 对于我正在处理的问题,我们有多种算法来解决它。为了保持一致性,我想创建一个标准接口并将其作为 DLL 分发给算法开发人员,以便他们可以继承它并创建自己的实现。现在对于接口 DLL,我尝试创建一个 DLL 项目,其中只有带有抽象基类声明的头文件。我将定义留空,因为我希望算法开发人员定义它们。现在的问题是我无法仅使用抽象基类声明来编译接口 DLL 项目。
      【解决方案4】:

      在 C++ 中使用 2 个命名空间用相同的头文件编写 2 个不同的实现

      namespace ImplementationA
      {
      }
      namespace ImplementationB
      {
      }
      

      当你想使用第一个实现时

      using implementationA;
      

      implementationA::function1();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 2010-11-25
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        • 2012-03-24
        • 2013-06-07
        相关资源
        最近更新 更多