首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pluma的插件

使用Pluma的插件
EN

Stack Overflow用户
提问于 2016-12-23 03:04:13
回答 1查看 635关注 0票数 0

概述

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

我找到了一个很好的库,名为Pluma (http://pluma-framework.sourceforge.net/),从功能上看,这似乎正是我想要的。

在阅读了他们的教程之后,我(有点困难)说服了插件来编译。但是,它拒绝友好地与主程序连接;返回各种错误取决于我如何实现它们。

问题

如果我注释掉标记为“main”的行(在最后一个文件main.cpp中),插件就会成功编译,主应用程序可以识别它,但是它说"Nothing registered by plugin 'libRNCypher'"和所有函数都不能调用。

如果我编译这一行,主应用程序将改为"Failed to load library 'Plugins/libRNCypher.so'. OS returned error: 'Plugins/libRNCypher.so: undefined symbol: _ZTIN5pluma8ProviderE".

我的猜测是,它与插件的编译方式有关,因为编译它最初不起作用,代码::块告诉我用"-fPIC“作为标志进行编译(这样做使它能够编译)。

代码: Main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

H(这是插件的一部分)

代码语言:javascript
复制
#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 (这是插件的一部分)

代码语言:javascript
复制
#include "../Encoder/Pluma/Connector.hpp"
#include "RNCypher.h"

PLUMA_CONNECTOR
bool connect(pluma::Host& host)
{
host.add( new RNCypherProvider() ); //<- Main problem line
return true;
}

附加细节

我正在Ubuntu16.04上编译,使用代码::块16.01。

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

我更喜欢使用现有的库,而不是编写自己的代码,因为我希望这是跨平台的。不过,我对任何建议都持开放态度。

对不起,所有的代码,但我相信,这是足够复制错误,我有。

谢谢

感谢您抽出时间阅读这篇文章,并提前感谢您的帮助!

祝大家节日愉快!

EN

回答 1

Stack Overflow用户

发布于 2017-01-05 12:00:54

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41294646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档