如何在c++中适当地包含第三方开源
How to include 3rd party open source properly in c++ ?
我使用一些第三方库,比如boost,我在我的项目中有一个类,命名为"MyClass"
"MyClass"的所有公共函数都只使用标准类型(int,char,string),但私有函数使用boost中的智能指针,以及其他库中的其他算法。
因此,在我在H文件中编写类(及其函数)的声明之前,我编写了几个包含文件。
为了使项目编译,我在项目属性中添加了一些额外的包含库。一切都很好。
问题是,当我想从另一个名为USERPROJECT的项目中使用这个类(类是外部的)时,我需要在USERPROJECT项目中包含MyClass.h文件,然后没有任何东西会编译,因为MyClass.h包含boost和其他未在USERPROJECT中配置的东西(我没有在这里配置额外的包含库,我不想因为他不需要知道它们,它们在MyClass类的私有函数中)。
解决方案是什么?
- 我是否应该将MyClass拆分为2类一个用于接口,一个用于实现?
- 我应该从H和MyClass中删除所有包含并使用前向声明吗?(我试过但编译失败)
- 有更好的解决方案吗
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是强制性的,但是这样做的工作量是相同的,以获得完全的提升,并避免混乱。
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- CMake 包含非 cmake 库的第三方标头
- 如何在粒子(Spark)的本地构建中包含第三方库?
- 如何使用 Bazel 构建包含 openssl 的第三方 c++ 库
- 如何在 Linux 上将所有第三方运行时依赖项包含在 cmake/cpack 生成的包中
- 如何将包含其他第三方C库的C++项目a链接到另一个项目B
- C++第三方库包含不存在的头文件
- 如何在c++中适当地包含第三方开源
- 如何禁止其他开发人员在c++中包含第三方头文件
- 将版本信息放入环境变量中以包含第三方库的路径是否合适?
- 创建包含第三方SDK的c++ DLL
- 在我的c++应用程序中包含第三方代码时遇到麻烦