我有一个包含2个项目 AlgorithmA &的Visual C ++解决方案。 AlgorithmB 并且都与类声明共享一个公共头文件 RunAlgo.h 。解决方案中的每个项目都有自己独特的头文件实现。
我正在尝试从公共头文件 RunAlgo.h 编译DLL,并在项目 AlgorithmA &中添加对此DLL的引用。的 AlgorithmB 即可。然后我在我的两个项目中都包含了单独的 RunAlgo.cpp 定义文件。问题是我在编译只有头文件的新DLL项目时遇到链接器错误。
所以,问题是
答案 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)
我认为要使头文件独立(一个接口),你需要使所有方法都是纯虚拟的。