插件使用Pluma

Plugins using Pluma

本文关键字:Pluma 插件      更新时间:2023-10-16

概述

我正在尝试开发允许用户创建插件的C 应用程序。

我找到了一个名为Pluma(http://pluma-framework.sourceforge.net/)的漂亮库,它似乎正是我想要的。

浏览了他们的教程后,我能够(有点困难)说服插件编译。但是,它拒绝播放不错,并与主要程序联系;根据我尝试实现它们的方式返回各种错误。

问题

如果我评论了标记为"主要问题行"的行(在最后一个文件中,main.cpp),插件成功编译了,并且主应用程序可以识别它,但是它说"Nothing registered by plugin 'libRNCypher'",没有任何功能可以称为。

如果我编译了该行,则主要应用程序说"Failed to load library 'Plugins/libRNCypher.so'. OS returned error: 'Plugins/libRNCypher.so: undefined symbol: _ZTIN5pluma8ProviderE".

我的猜测是,它与插件的方式有关,因为它最初是不起作用的,并且code :: blocks告诉我用" -fpic"作为标志编译(这样做使其编译了)。

代码

代码下面:main.cpp

#include "Pluma/Pluma.hpp"
#include "CryptoBase.h"
int main()
{
pluma::Pluma manager;
manager.acceptProviderType< CryptoBaseProvider >();
manager.loadFromFolder("Plugins", true);
std::vector<CryptoBaseProvider*> providers;
manager.getProviders(providers);
return 0;
}

cryptobase.h

#ifndef CRYPTOBASE_H_INCLUDED
#define CRYPTOBASE_H_INCLUDED
#include "Pluma/Pluma.hpp"
#include <string>
#include <vector>
#include <bitset>
//Base class from which all crypto plug-ins will derive
class CryptoBase
{
public:
CryptoBase();
~CryptoBase();
virtual std::string GetCypherName() const = 0;
virtual std::vector<std::string> GetCryptoRecApps() const = 0;
virtual void HandleData(std::vector< std::bitset<8> > _data) const = 0;
};
PLUMA_PROVIDER_HEADER(CryptoBase)
#endif // CRYPTOBASE_H_INCLUDED

rncypher.h(这是插件的一部分)

#ifndef RNCYPHER_H_INCLUDED
#define RNCYPHER_H_INCLUDED
#include <string>
#include <vector>
#include <bitset>
#include "../Encoder/Pluma/Pluma.hpp"
#include "../Encoder/CryptoBase.h"
class RNCypher : public CryptoBase
{
public:
std::string GetCypherName() const
{
    return "RNCypher";
}
std::vector<std::string> GetCryptoRecApps() const
{
    std::vector<std::string> vec;
    vec.push_back("Storage");
    return vec;
}
void HandleData(std::vector< std::bitset<8> > _data) const
{
    char letter = 'v';
    _data.clear();
    _data.push_back(std::bitset<8>(letter));
    return;
}
};
PLUMA_INHERIT_PROVIDER(RNCypher, CryptoBase);
#endif // RNCYPHER_H_INCLUDED

main.cpp(这是插件的一部分)

#include "../Encoder/Pluma/Connector.hpp"
#include "RNCypher.h"
PLUMA_CONNECTOR
bool connect(pluma::Host& host)
{
host.add( new RNCypherProvider() ); //<- Main problem line
return true;
}

其他详细信息

我正在使用code :: blocks 16.01。

编译Ubuntu 16.04

第二个错误消息似乎不是来自Pluma本身,而是我也必须链接的文件#include <dlfcn.h>(可能是Linux文件?)。

我希望使用现有库,而不是写自己的代码,因为我希望这是跨平台。但是,我对任何建议都开放。

对所有代码感到抱歉,但我相信这足以重现我的错误。

谢谢

感谢您抽出宝贵的时间阅读本文,并提前感谢您的帮助!

一切都最好,节日快乐!

我无法重现您的问题,但是看着http://pluma-framework.sourceforge.net/documentation/index.htm,我注意到了:

  • 在您的rncypher.h文件中,您错过了

    之类的东西
    PLUMA_INHERIT_PROVIDER(RNCypher, CryptoBase)
    
  • 似乎也没有file cryptobase.cpp包含

    之类的东西
    #include "CryptoBase.h"
    PLUMA_PROVIDER_SOURCE(CryptoBase, 1, 1); 
    
  • 最后,在cryptobase.h中,我会声明虚拟驱动器(请参阅为什么我要声明C 中的抽象类的虚拟破坏者?)并为其提供定义,而您不应声明默认的构造函数没有提供定义的情况(例如,仅对C 中的空私有构造函数使用声明是正确的吗?);当然,除非有另一个文件提供了此类定义,否则最后一个考虑是有效的。