说我有三个库,都是用C ++编写的:
-
logging.a
:一个用于记录日志的静态库。它定义了一个抽象类,其他类可使用该抽象类来自定义其日志记录(通过实现纯虚拟方法virtual void CustomLogger::customLogging(std::string) = 0
)。 -
libmainproject.so
:主库。它包含一个外部未知的类(CustomLoggerImpl
),该类扩展了CustomLogger
并实现了自定义日志记录方法。 -
libplugin.so
:一个插件库,需要记录内容并希望将其记录与libmainproject
中的记录集成。
libmainproject
和libplugin
之间的接口是C接口,尽管两个库的内部都是用C ++编写的。
libplugin
不知道CustomLoggerImpl
内是否存在libmainproject
,但确实从CustomLogger
知道了接口logging
。
为了使用来自libplugin
的自定义日志记录,我已将指向CustomLoggerImpl
的指针传递为void *
(因为它是通过C接口发生的,因此无法使用自定义对象)。
一旦我需要登录插件,就将void *
(指向CustomLoggerImpl
对象)转换为CustomLogger *
(Liskov替换原理)。然后,我调用customLogger->customLogging("whatever");
。
尽管没有崩溃,但呼叫似乎并未打到libmainproject
。为什么会这样?我认为问题是vtable出现了问题,因此它无法从其他没有对象定义的二进制文件中正常工作,但还需要更多深入解释为什么会发生这种情况。