【发布时间】:2010-03-05 21:09:56
【问题描述】:
我正在重构一套旧实用程序并创建一个新服务器,该服务器将使用所有这些实用程序的通用代码来统一它们的功能并允许远程客户端进行外部访问。对于每个实用程序,我将获取服务器所需的代码并将其重构到共享库中,以便实用程序和服务器现在都链接到共享库。由于这些实用程序的前实现者做事的方式,他们几乎只是在需要创建新实用程序时复制和粘贴所有内容,因此有大量具有相同签名的函数(即 XML 解析器的回调)但是在里面做不同的事情。
当我运行经过重构以链接到共享代码的独立实用程序时,它们运行良好。当我尝试使用与给定实用程序具有相同功能的服务器时,服务器使用的是第一个链接的库中的代码,而不是它应该从中获取功能的库。
例如,我有设备 A、B、C 的 xml,这些设备由公共 xml 库解析,但每个设备都有自己的共享库 libA、libB、libC,供服务器使用。当我调用服务器为设备 C 发送 xml 时,它使用的是 libA 中的函数“HandleStartElement”,而不是 libC 中同名和签名的函数,即使共享库只在内部声明这些函数并且不要t 共享任何提及这些用于解析 xml 的内部回调的标头。
有人可以向我解释为什么它没有读取正确的功能,以及将来如何避免这种情况?
我的服务器生成文件具有以下用于编译主程序的标志:
-I../include -L../lib -lA -lB -lC
每个共享库几乎没有使用共享库的标志,并且没有使用 -fPIC。
【问题讨论】:
标签: gcc shared-libraries unix