如何在c ++中正确包含第三方开源?

时间:2013-06-05 14:21:33

标签: c++ include

我使用了几个第三方库,比如boost,我的项目中有一个类,让我们说它叫做“MyClass”

“MyClass”的所有公共函数仅使用标准类型(int,char,string),但私有函数使用boost中的智能指针和其他库中的其他算法。

所以在我在H文件中编写类的声明(及其函数)之前,我写了几个包含文件。

为了使项目编译,我将一些附加包含库添加到项目属性中。 一切正常。

问题是,当我想从另一个名为USERPROJECT的项目中使用这个类(该类是extern)时,我需要在USERPROJECT项目中包含MyClass.h文件,然后什么都不会编译,因为MyClass.h包含了boost和其他未在USERPROJECT中配置的东西(我没有在这里配置其他包含库,我不想,因为他不需要知道它们,它们在MyClass类的私有函数中)

我的解决方案是什么?

  1. 我应该将MyClass拆分为2类接口和一条接口实现?
  2. 我应该从H和MyClass中删除所有包含并使用前向声明吗? (我尝试但未能编译)
  3. 有更好的解决方案
  4. 提前致谢

2 个答案:

答案 0 :(得分:2)

您可以使用pimpl习惯用法创建编译器防火墙:

// header file
class C
{
public:
    ...
private:
    struct Impl;
    boost::scoped_ptr<Impl> m;
};

// cpp file
struct C::Impl
{
    // data member that were in C previously go here //
};

这样使用头文件的代码看不到你班级的内容。这个成语详细解释here。但是,如果使用需要链接的boost库,仍然可能会出现链接错误。如果仅使用boost的仅标题部分,则应该没有问题。

答案 1 :(得分:0)

理想的是每个项目都可以访问每个外部组件。 (并且所有都使用兼容选项编译等)。

如果你可以推进,你的问题将得到解决。而其他人想要使用提升但遇到同样障碍的问题。

如果你不能这样做,你可能仍然有使用pimpl的解决方案,但它增加了一定的复杂性,维护开销并在一定程度上降低了可读性。并且取决于你在boost中使用的内容,可能只解决问题的编译部分,因为链接可能需要一些额外的lib。 (除非你的东西是自包含的,比如DLL)

对于后一种情况,如果链接发生在客户端站点,那么走私lib是强制性的,但是完全提升是相同的工作量,并避免混乱。所以在行动之前做一些研究。