如何在c++中适当地包含第三方开源

How to include 3rd party open source properly in c++ ?

本文关键字:包含 第三方 开源 c++      更新时间:2023-10-16

我使用一些第三方库,比如boost,我在我的项目中有一个类,命名为"MyClass"

"MyClass"的所有公共函数都只使用标准类型(int,char,string),但私有函数使用boost中的智能指针,以及其他库中的其他算法。

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

为了使项目编译,我在项目属性中添加了一些额外的包含库。一切都很好。

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

解决方案是什么?

  1. 我是否应该将MyClass拆分为2类一个用于接口,一个用于实现?
  2. 我应该从H和MyClass中删除所有包含并使用前向声明吗?(我试过但编译失败)
  3. 有更好的解决方案吗

Thanks in advance

您可以使用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 //
};

这样,使用头文件的代码就看不到类的内部结构。下面详细解释这个习语。但是,如果您使用需要链接的boost库,您仍然可以获得链接错误。如果您只使用boost的头文件部分,那么应该没有问题。

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

如果你能朝着那个方向努力,你的问题就会解决。以及其他想要使用boost但面临同样障碍的人的问题。

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

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