重用C ++头文件

时间:2010-06-06 08:21:06

标签: c++ file dll header

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

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

所以,问题是

  1. 是否可以将仅包含类声明的头文件编译为DLL( 类似于包含C#中的接口的类库 )?
  2. 对于上面的场景,是否有更好的方法在项目中重用常用的Header文件?
  3. 上述方法是否有效(重新检查我的代码?)

5 个答案:

答案 0 :(得分:4)

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

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

2:你所做的基本上是唯一的解决方案。将公共头文件放在它们自己的目录中,并将该目录添加到两个项目中的每个项目的包含路径中。

答案 1 :(得分:1)

  

只有类的头文件   声明被编译成DLL

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

  

对于上面的场景,有没有   更好地重用常见的方法   项目中的头文件?

重用标题很好。实际上,每个库都有它需要包含在使用该库的项目中的标题集。

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

答案 2 :(得分:0)

至1:

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

至2:

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

至3。:

不,不应该。见第1点。

答案 3 :(得分:0)

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

namespace ImplementationA
{
}
namespace ImplementationB
{
}

如果您想使用第一个实现

using implementationA;

implementationA::function1();

答案 4 :(得分:-1)

我认为要使头文件独立(一个接口),你需要使所有方法都是纯虚拟的。