两个可以互相扩展的库

问题描述 投票:0回答:1

所以我正在为我和我的团队开发一个模块化 C++ 库。这是我的情况:

我有一个库

A
,其中包含复杂的存储控件
class a
。我还有一个库
B
,它类似于包含特殊响应的复杂协议的接口。现在,我想在 a 类中有一个函数,可以使用
B
。这对于使用
X
A
的程序
B
很有帮助。但还有程序
Y
,它只会使用
A
,而不使用复杂的库
B

如何在 C++ 中获得这种行为?我是否需要宏、符号,或者是否有其他方法可以轻松实现此目的,以便我不需要在程序中包含额外的文件?哪种类型的图书馆更好?

c++ class
1个回答
5
投票

这在系统库中很常见,可以在(库)编译时选择可选功能。通过这种方法,您将拥有一个或多个

#define
预处理器宏来保护可选功能。因此,在库 A 中:

#ifdef USE_LIBRARY_B
#include <b/foo.h>
int A_optional_feature_using_B(void) { ... }
#endif

// rest of library A follows

在编译时,您可以定义

USE_LIBRARY_B
或不定义(当然还可以添加任何必要的链接器标志)。例如,在类 UNIX 平台上使用
gcc

$ gcc ... -DUSE_LIBRARY_B ...

最常见的是,诸如

autoconf
之类的内容用于 UNIX 环境,以便最终用户能够轻松选择可选功能。因此,您可能会看到:

me@pc:library_a$ ./configure --with-library-b

有关如何设置类似内容的信息,请参阅

autoconf
文档。

在 Windows 上,您可以执行类似的操作(例如,在 Visual Studio 中,使用定义适当宏的不同项目/解决方案配置)。


以上内容为您提供了仅编译时对额外功能的控制。为了允许在运行时做出选择,以便库可以使用 B(如果存在),您将需要使用运行时动态链接。这是高度特定于平台的。在 Linux 上,使用

libdl
。在 Windows 上,使用
LoadLibrary()
和朋友。在这里,您将必须执行大量额外的编码来查找并加载可选库(如果存在),并返回适当的错误代码/异常(如果不存在)并调用需要可选库的函数。


如果这一切听起来像是后背疼痛,那么你是对的,确实如此。如果有任何合理的方法来调整你的策略,这样你就不必这样做,你的情况会更好。但对于某些用例来说,这必要且适当的,如果您的情况是这样,那么我希望上述内容能为您提供一些起点,祝您好运。

© www.soinside.com 2019 - 2024. All rights reserved.