【发布时间】: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++