我有一个包含多个子模块的项目,这些子模块使用由一个进程序列化的一些对象进行通信,然后由另一个进程反序列化并在另一个进程中使用。因此,这些对象需要包含在第一个进程中使用的逻辑,在第二个进程中以及序列化和反序列化逻辑。
为了简化项目的构建,每个进程首先构建一个库,然后链接到该库(使用专用的main)来构建实际的进程。所有处理通信的部分(即所有交叉切割对象)也包含在其他更通用的库中。
现在的问题是,通用库的使用代码包含引用第二个进程中其他对象的方法。所以结构是这样的:
这样我就得到了一个我不想要的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
}
};
从这个方面来看,最好的方法似乎是将所有线程内容(队列所属的部分)移除到一个公共子模块,然后让所有进程都使用它。
答案 0 :(得分:1)
解决此问题的一种方法是动态链接libB(如果您担心可执行文件的大小)。
另一种选择是将libA和libB中的公共代码放入库(libC)中。然后,您的程序将需要链接libA和libC,以及libB和libC。
我没有看到别的方法。