C++ 包含来自不同库的
我必须创建一个工厂方法,它可以从不同的lib创建对象。我的目录树如下所示: libA/src/…C++ 包含来自不同库的,c++,include,C++,Include,我必须创建一个工厂方法,它可以从不同的lib创建对象。我的目录树如下所示: libA/src/… libB/src/… libC/src/… src/ libA、libB等是分开编译的 让工厂类位于libA/src/factory.h中。它应该从libB/src/someclass.h创建一个对象 如果我在Factory.h中包含.././libB/src/someclass.h,那么libA无法编译,因为它无法从someclass.h中找到包含项(comiler在libA/src中查找它们,但
libB/src/…
libC/src/…
src/ libA、libB等是分开编译的 让工厂类位于libA/src/factory.h中。它应该从libB/src/someclass.h创建一个对象 如果我在Factory.h中包含.././libB/src/someclass.h,那么libA无法编译,因为它无法从someclass.h中找到包含项(comiler在libA/src中查找它们,但它们在libB/src中)。如果我不包含,它不知道someclass,因此我无法创建它的实例
有什么解决办法吗 您正在寻找向前声明:在类只需要知道类型的头中,使用
class-AFactory声明它代码>而不是包括整个工厂。h
编辑
在重新阅读您的问题之后,我发现您希望单独编译库这一事实与libA工厂必须知道libB类这一事实之间存在矛盾。您不能单独编译,因此我只需提供所有必要的目录路径以包含路径。您正在寻找向前声明:在类只需要知道类型的头中,使用class AFactory声明它代码>而不是包括整个工厂。h
编辑
在重新阅读您的问题之后,我发现您希望单独编译库这一事实与libA工厂必须知道libB类这一事实之间存在矛盾。您无法单独编译,因此我只需提供所有必要的目录路径来包含path。我试图重现此错误,但我的示例使用相同的目录结构,效果很好
#ifndef FACTORY_H_
#define FACTORY_H_
#include "../../libB/src/Someclass.h"
class Factory {
public:
Factory();
virtual ~Factory();
};
#endif /* FACTORY_H_ */
当存在直接依赖关系时,如何分别编译它们?也许你想使用一个静态链接库。请解释一下你的意图 我试图重现这个错误,但我的示例使用了相同的目录结构,效果很好
#ifndef FACTORY_H_
#define FACTORY_H_
#include "../../libB/src/Someclass.h"
class Factory {
public:
Factory();
virtual ~Factory();
};
#endif /* FACTORY_H_ */
当存在直接依赖关系时,如何分别编译它们?也许你想使用一个静态链接库。请解释一下你的意图 不是类应该知道工厂,工厂应该知道(也应该使用)类。因为工厂必须使用它们,所以远期声明是不够的。接受这一点,它是有效的,但我正在寻找其他解决方案,因为LIB不能相互依赖。现在我想我应该修改一下我的结构。不是类应该知道工厂,工厂应该知道(也应该使用)类。因为工厂必须使用它们,所以远期声明是不够的。接受这一点,它是有效的,但我正在寻找其他解决方案,因为LIB不能相互依赖。现在我想我应该修改一下我的结构。在这个例子中,libB/src中应该有一个类似于Anotherclass.h的东西,在Someclass.h中有一行#include“Anotherclass.h”,每个lib*文件夹都有自己的makefile,最后我可以用开关选择应该链接到最终二进制文件的内容。好吧,让我们说你的“make”构建了“one”一次一个目录。编译器将收集标题中提到的所有包含的文件,并使用默认设置构建一个静态lib-oder二进制文件。因此,如果您“创建”您的工厂,那么将收集所有包含的文件和头文件,以及所有使用的实现文件(整个依赖关系树)。我看没问题,只要你没有。但也许那不是你想要的。在这个例子中,libB/src中应该有一个类似Anotherclass.h的东西,Someclass.h中应该有一行#include“Anotherclass.h”。每个lib*文件夹都有自己的makefile,最后我可以用开关选择应该链接到最终二进制文件的内容。好的,让我们说一下“make”构建每次“一个”目录。编译器将收集标题中提到的所有包含的文件,并使用默认设置构建一个静态二进制文件库。因此,如果您“创建”工厂,将收集所有包含的文件和标题文件,以及所有使用的实现文件(整个依赖关系树).只要你没有,我看没问题。但也许那不是你想要的。重新考虑一下你之前想要的项目结构。