【问题标题】:Remove unused method in dependency删除依赖中未使用的方法
【发布时间】:2011-04-19 18:46:59
【问题描述】:

我有一个包含多个子模块的项目,这些子模块使用一些对象进行通信,这些对象由一个进程序列化,然后由另一个进程反序列化并在另一点使用。所以这些对象需要包含在第一个过程中使用的逻辑,在第二个过程中以及序列化和反序列化逻辑。

为了简化项目的构建,每个流程首先构建一个库,然后与该库链接(使用专门的 main)来构建实际流程。所有处理通信的部分(即所有横切对象)也包含在其他更通用的库中。

现在的问题是使用通用库的代码包含引用来自第二个进程的其他对象的方法。所以结构是这样的:

  • 进程A:
    • 取决于 libA libGeneric
  • 进程 B:
    • 取决于 libB libGeneric
  • libGeneric 包含引用部分 libA 和 libB 的代码

这样,我得到了我不想要的 libB 的 processA 依赖项。依赖只是为了满足链接器,因为使用 libB 的代码实际上从未被调用(但链接器不会知道这一点)。所以现在我将 libB 链接到 processA 虽然来自该 lib 的代码永远不会被执行。

有没有更好的方法来处理这种情况?另一个想法是只定义接口,只包含在 libGeneric 中实际使用的方法,并将其他方法放入 libB。但是,我会将对象从 libGeneric 中分离出来,这会使维护变得更加困难。

我正在使用 G++ 4.4 进行编译。


编辑: 因为我不能在这里发布实际项目中的代码,所以一些结构化的伪代码可能会更清楚地显示问题:

class Record {
public:
  void produce(...) // called from Process A
  std::string serialize() const;
  void deserialize(const std::string &);

  void do_something(queue) { // called from process B
    // this logic is actually more complicated (depends on subclasses of Record)
    // i.e. cannot be moved out of this class without getting ugly
    queue.add_for_further_processing( this ); // The queue is part of ProcessB
  }
};

由此看来,最好的方法似乎是将所有线程的东西(队列是其中的一部分)删除到一个公共子模块中,然后让所有进程都使用它。

【问题讨论】:

  • The dependency is just to satisfy the linker, because the code that uses libB is never actually called (but the linker will not know this). - 这毫无意义。如果它不会被调用,则删除对 libB 的所有依赖项,并删除 libB 的标头
  • 好的,澄清一下:libGeneric 中的对象之一包含要在 ProcessB 中使用的方法。这些方法包含对来自 libB 的代码的调用。但是,包含这些调用的方法仅在 ProcessB 中使用,而不在 ProcessA 中使用。所以链接器认为有一个对 libB 的调用,但这个调用从未发生过。因为我需要 ProcessB 中的代码,所以我不能简单地删除整个方法。
  • 如果 libGeneric 调用 libB 中的代码,那么它并不是真正的通用代码。你可以将libGeneric 中使用libB 的部分移动到libB 中吗?或者,将它们全部组合到一个库中可能更有意义,尽管这意味着 ProcessA 可以看到 libB 和 ProcessB libA。

标签: c++ architecture g++


【解决方案1】:

解决此问题的一种方法是与 libB 动态链接(如果您关心可执行文件的大小)。

另一种选择是将公共代码从 libA 和 libB 中取出到库 (libC) 中。然后,您的程序将需要链接 libA 和 libC,以及 libB 和 libC。

我没有看到其他方法。

【讨论】:

  • 很遗憾,我无法使用动态链接。分离成一个公共库是我上面描述的 libGeneric 的来源。然而,有问题的是来自这种分离的对 libA 和 libB 的回调点,我不确定如何删除。我想最简单的部分是省略 libGeneric 的一些对象方法,尽管这意味着我需要将一个对象分离到多个库。我只是希望这不会带来维护问题。
  • 你能发布一些代码吗?您提到了一些对 libA 和 libB 的回调。这些回调到底有什么问题?
  • 附加说明:当然,另一个想法是将更多代码从 ProcessB 删除到 libGeneric。但这意味着 libGeneric 将开始成为“(反)序列化和冲泡咖啡”类型的库,这再次暗示了糟糕的设计。
  • 或者,创建 libC,然后将 libB 中的内容移动到这个新库中
猜你喜欢
  • 2015-10-20
  • 2020-12-07
  • 2023-02-11
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2017-03-07
  • 2017-03-16
  • 2013-10-23
相关资源
最近更新 更多