代码之家  ›  专栏  ›  技术社区  ›  Panakotta00

两个可以相互扩展的库

  •  1
  • Panakotta00  · 技术社区  · 7 年前

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

    我有一个图书馆 A 其中包含一个复杂的存储控件 class a 。我还有一个图书馆 B 这有点像一个复杂协议的接口,它包含一个特殊的响应。现在,我想在类a中有一个函数,它可以使用 B 。这对程序有帮助 X ,它使用 A. B 。但也有计划 Y ,它将仅使用 A. 而不是复杂的图书馆 B

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   TypeIA    7 年前

    这在系统库中非常常见,可以在(库)编译时选择可选功能。使用这种方法,您将有一个或多个 #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 或者不添加(当然还要添加任何必要的链接器标志)。例如,使用 gcc 在类UNIX平台上:

    $ gcc ... -DUSE_LIBRARY_B ...
    

    最常见的是 autoconf 用于UNIX环境,使最终用户能够轻松地选择可选功能。因此,您可能会看到:

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

    请参见 自动确认 有关如何设置类似内容的信息的文档。

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


    上面给你 仅编译时 控制额外功能。允许在以下位置进行选择: 运行时 为了使库可以使用B(如果存在),您需要使用运行时动态链接。这是高度特定于平台的。在Linux上,使用 libdl 。在Windows上,使用 LoadLibrary() 还有朋友。在这里,您必须进行大量额外的编码来查找和加载可选库(如果存在),如果不存在,则返回适当的错误代码/异常,并调用需要可选库的函数。


    如果这一切听起来像是后遗症,那么你是对的。如果有任何合理的方法来调整你的战略,这样你就不必这么做,你会过得更好。但对于某些用例 如果你的想法是必要的和适当的,那么我希望以上内容能给你一些出发点,祝你好运。

    推荐文章