我正在重构一套旧的实用程序,并创建一个新的服务器,该服务器将使用它们所有的共同代码来统一它们的功能,并允许远程客户端进行外部访问。对于每个实用程序,我正在提取出我需要用于服务器的代码,并将其重构为一个共享库,以便实用程序和服务器现在都可以链接到该共享库。由于这些实用程序的前任实现者的做法,他们几乎只是在需要创建新实用程序时复制并粘贴了所有内容,因此有大量具有相同签名(即XML解析器的回调)但内部执行不同操作的函数。
当我运行已经重构为链接到共享代码的独立实用程序时,它们完美地工作。但是,当我尝试使用与给定实用程序相同功能的服务器时,服务器使用的是第一个链接库中的代码,而不是应该获取功能的库。
例如,我有针对设备A、B、C的XML,这些XML会被一个通用的XML库解析,但是每个设备都有自己的共享库libA、libB、libC供服务器使用。当我调用服务器发送设备C的XML时,它使用的是libA中的“HandleStartElement”函数,而不是libC中同名且带有相同签名的函数,即使共享库仅在内部声明这些函数,而没有共享任何头文件来提及这些解析XML的内部回调。
请问有人能够解释一下为什么它没有读取正确的函数,以及如何避免这种情况发生?
我的服务器makefile具有以下编译主程序的标志:
当我运行已经重构为链接到共享代码的独立实用程序时,它们完美地工作。但是,当我尝试使用与给定实用程序相同功能的服务器时,服务器使用的是第一个链接库中的代码,而不是应该获取功能的库。
例如,我有针对设备A、B、C的XML,这些XML会被一个通用的XML库解析,但是每个设备都有自己的共享库libA、libB、libC供服务器使用。当我调用服务器发送设备C的XML时,它使用的是libA中的“HandleStartElement”函数,而不是libC中同名且带有相同签名的函数,即使共享库仅在内部声明这些函数,而没有共享任何头文件来提及这些解析XML的内部回调。
请问有人能够解释一下为什么它没有读取正确的函数,以及如何避免这种情况发生?
我的服务器makefile具有以下编译主程序的标志:
-I../include -L../lib -lA -lB -lC
每个共享库仅使用了与共享库相邻的标志,并且未使用-fPIC。