c ++库的公共头文件中应包含什么?

时间:2018-11-04 18:02:51

标签: c++ cmake shared-libraries

我正在构建一个小型的c ++共享库,该库具有这样的类(在头文件上)

class Foo {
  ...
  std::optional<some_type> _bar;
  ...
};

由于std::optional是C ++ 17,所以包含上述文件的任何人都需要编译C ++ 17。但是,_bar不是库公共接口的一部分。 _bar仅在实现中使用。因此,我的问题是,如何公开仅公开公共方法但维护我的实现C ++ 17的头文件?我希望我不必强迫库的用户使用C ++ 17,对吧?

如果重要的话,我也正在使用CMake生成构建文件。

1 个答案:

答案 0 :(得分:0)

由于您正在构建共享库:

您可以定义具有所有接口(纯虚拟)的基类BaseFoo

然后从Foo导出BaseFoo,并添加一个工厂函数:getFoo

然后,将您的Foo实现为动态库,并导出工厂函数(__attribute__ ((visibility ("default")))

现在,将BaseFoo标头与动态库一起发送(确保客户端使用的libstdc ++版本相同)。