2012-07-10 64 views
2

我的库包含一个接口(表示一个摄像头)和一些派生类。
每个派生类实现到特定的HW,这导致每个派生类依赖于外部供应商库。C++ Factory和链接器依赖关系

  • 每个派生类是一个静态库和链接它的库依赖

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

  • 工厂的#includes和链接所有派生类,而库用户不知道派生impls。 create()是天真地实现:

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

所以基本上有一个臃肿Factory.lib,包括所有必要的依赖,和图书馆用户可以通过只需链接创建任何相机IMPL Factory.lib

问题

  1. 当您链接到Factory.lib时,运行应用程序时需要所有供应商提供的所有dll。理想情况下,我希望你只需要你正在使用的特定相机的DLL。有没有办法做到这一点?
  2. 我正在考虑编译每个派生作为一个DLL而不是库。现在Factory.lib不会臃肿,并且所有相机特定的依赖项都位于每个派生的dll中。如果我不解决li#1,这没有多大帮助,因为除了Factory.lib和供应商dll之外,您仍然需要所有派生的dll。
  3. 有更好的方法来实现造物主类(或方法)吗?我的派生类是有限的数字,5-6,并且不经常增长。
  4. 任何其他提示,以最大限度地减少依赖性,提高了设计,欢迎
+0

Dlls可以[延迟加载](http://msdn.microsoft.com/en-us/library/151kt790.aspx)。我从来没有这样做过,所以我不知道它是否适合你的需求(因此,这是一个评论而不是回答),但它可能会消除所有Dll可用的需要。 – eran 2012-07-10 09:28:24

回答

3

您可以在运行时加载共享库(或DLL)。你必须知道在哪里(在哪个DLL)寻找特定的ICamera实现。你可以例如导出每个dll的第二个函数,它提供了完整的信息,哪些实现(类型==“a”和类型==“c”)由特定的dll提供。启动应用程序时,它可以搜索dll并为每个dll调用该信息界面。

+0

+1。你确实可以在运行时加载库 – 2012-07-10 09:43:42