2

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

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

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

  • 工厂#includes 并链接所有派生类,库用户不知道派生的实现。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. 欢迎任何其他可以最小化依赖关系和改进设计的技巧
4

1 回答 1

3

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

于 2012-07-10T09:10:34.253 回答