【问题标题】:C++ Factory and Linker dependenciesC++ 工厂和链接器依赖项
【发布时间】:2012-07-10 08:51:11
【问题描述】:

我的库包括一个接口(代表一个相机)和一些派生类。
每个派生类都实现到特定的硬件,这导致每个派生类都依赖于外部供应商库。

  • 每个派生类都是一个静态库并链接其库依赖项

  • 我只提供一个名为Factory的类,它有一个方法:
    ICamera* create(const std::string& type)

  • 工厂#includes 并链接所有派生类,库用户不知道派生的impl。 create() 被天真地实现了:

    if (type == "a") return new CameraA();
    if (type == "b") return new CameraB();
    ...

所以基本上有一个臃肿的 Factory.lib 包含所有必要的依赖项,库用户可以通过链接到 Factory.lib 来创建任何相机 impl

问题

  1. 链接到 Factory.lib 时,运行应用程序时需要所有供应商提供的所有 dll。理想情况下,我希望您只需要您正在使用的特定相机的 dll。有没有办法做到这一点?
  2. 我正在考虑将每个派生的文件编译为 dll 而不是 lib。现在 Factory.lib 并不臃肿,所有相机特定的依赖项都在每个派生的 dll 中。如果我不解决li #1,这将无济于事,因为除了 Factory.lib 和供应商 dll 之外,您仍然需要所有派生的 dll。
  3. 有没有更好的方法来实现 Creator 类(或方法)?我的派生类数量有限,只有 5-6 个,而且不会经常增长。
  4. 欢迎提供任何其他可最大限度减少依赖关系和改进设计的技巧

【问题讨论】:

  • Dlls 可以是Delay Loaded。我从来没有这样做过,所以我不知道它是否符合您的需求(因此将此作为评论而不是回答),但它可能会消除让所有 Dll 可用的需要。

标签: c++ dependencies factory


【解决方案1】:

您可以在运行时加载共享库(或 dll)。您必须知道在哪里(在哪个 dll 中)查找特定的 ICamera 实现。例如,您可以为每个 dll 导出第二个函数,该函数提供准确的信息,即特定 dll 提供了哪些实现(type=="a" 和 type=="c")。启动应用程序时,它可以搜索dll并为每个dll调用该信息接口。

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多