C++ 删除依赖项中未使用的方法

C++ 删除依赖项中未使用的方法,c++,architecture,g++,C++,Architecture,G++,我有一个包含多个子模块的项目,这些子模块使用一些对象进行通信,这些对象由一个进程序列化,然后由另一个进程反序列化,并在另一点使用。因此,这些对象需要包含用于第一个进程、第二个进程以及序列化和反序列化逻辑的逻辑 为了简化项目的构建,每个流程首先构建一个库,然后链接到该库(使用专用的main)以构建实际的流程。处理通信的所有部分(即所有横切对象)也包含在其他更通用的库中 现在的问题是,泛型库的使用代码包含引用第二个进程中的其他对象的方法。结构是这样的: 过程A: 取决于libA libGener

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

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

现在的问题是,泛型库的使用代码包含引用第二个进程中的其他对象的方法。结构是这样的:

  • 过程A:
    • 取决于libA libGeneric
  • 过程B:
    • 取决于libB libGeneric
  • libGeneric包含引用libA和libB部分的代码
这样,我就得到了我不想要的processA对libB的依赖关系。依赖关系只是为了满足链接器,因为使用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
  }
};

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

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

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


我看不到其他解决方法。

依赖关系只是为了满足链接器,因为使用libB的代码从未真正被调用过(但链接器不会知道这一点)。
-这没有任何意义。如果不调用它,则删除libB上的所有依赖项,并删除libBOk的头,以澄清:libGeneric中的一个对象包含要在ProcessB中使用的方法。这些方法包含对libB中代码的调用。但是,包含这些调用的方法仅在ProcessB中使用,而不在ProcessA中使用。所以链接器认为有一个对libB的调用,但这个调用从未发生过。因为我需要ProcessB中的代码,所以我不能简单地删除整个方法。如果libGeneric调用libB中的代码,那么它就不是真正的泛型。能否将libGeneric中使用libB的部分移动到libB中?或者,将它们合并到一个库中可能更有意义,尽管这意味着ProcessA可以看到libB和ProcessB libA。分离到一个公共库就是上面描述的libGeneric的来源。然而,问题在于从这个分离中回调到libA和libB的点,我不确定如何删除这些点。我想最简单的部分是省略libGeneric的一些对象方法,尽管这意味着我需要将一个对象分离为多个lib。我只是希望这不会带来维护问题。你能发布一些代码吗?您提到了对libA和libB的一些回调。这些回调到底有什么问题?另外注意:另一个想法当然是从ProcessB到libGeneric删除更多代码。但这将意味着libGeneric将开始成为一种“(反)序列化并煮咖啡”类型的库,这再次暗示了糟糕的设计。或者,创建libC,并将内容从libB移到这个新库中