我在C ++中创建了一个插件接口,它依赖于每个模块上的抽象基类和C-linkage工厂,如下所示:
plugin.h:
class Plugin
{
public:
virtual uint8_t some_number ( void ) = 0;
};
plugin1.cpp:
class plugin1
{
public:
uint8_t some_number ( void ) override;
};
extern "C" Plugin *
new_plugin
( void )
{
return new plugin1;
}
考虑到没有标准的ABI,我想检查一个插件是否与应用程序兼容。为此,使用两个8位整数来标识接口版本。但是,这只能解决添加或删除方法的问题;它没有处理使用遵循不同约定的工具链构建应用程序和插件的情况。
是否有任何方法来编码ABI的标识符(即在编译时定义的以NULL结尾的字符数组)?像这样:
/* defined by the compiler */
#define ABI "gnu-X.Y"
/* and then, in each plugin */
const char * plugin_abi = ABI;
由于我还没有找到任何东西,我认为没有标准的方法可以做到,而且我必须从构建系统处理它。 无论如何,是否有任何方法可以对工具链ABI进行编码,以便以后通过dlsym进行检索和识别?
谢谢!