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