删除依赖项中未使用的方法
我有一个包含多个子模块的项目,这些子模块使用一些对象进行通信,这些对象由一个进程序列化,然后由另一个进程反序列化,并在另一个点使用。 因此这些对象需要包含第一个进程中的使用逻辑,第二个进程中的使用逻辑以及序列化和反序列化逻辑。
为了简化构建项目,每个过程首先构建一个库,然后与该库链接(使用专门的主库)来构建实际的过程。 所有处理通信的部分(即所有交叉对象)也包含在其他更通用的库中。
现在问题是使用通用库的代码包含引用第二个进程中其他对象的方法。 所以结构是这样的:
这样我就得到了我不想要的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
}
};
由此看来,最好的方法似乎是将所有线程化的东西(其中队列的一部分)移除到一个公共的子模块,然后让所有的进程使用它。
解决这个问题的一种方法是动态链接libB(如果可执行文件的大小是你关心的话)。
另一种选择是将libA和libB的通用代码放入库(libC)中。 然后,您的程序将需要与libA和libC以及libB和libC链接。
我没有看到其他方式。
链接地址: http://www.djcxy.com/p/60525.html