c++ - 使用 Pluma 的插件

标签 c++ c linux plugins

概览

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

我发现了一个名为 Pluma ( http://pluma-framework.sourceforge.net/ ) 的不错的库,它在功能上似乎正是我想要的。

完成他们的教程后,我能够(有点困难)说服插件进行编译。但是,它拒绝播放和连接主程序;根据我尝试实现的方式返回各种错误。

问题

如果我注释掉标记为“Main problem line”的行(在最后一个文件 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;
}

密码库.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;
}

其他详细信息

我在 Ubuntu 16.04 上编译,使用 Code::Blocks 16.01。

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

我更愿意使用现有的库而不是编写自己的代码,因为我希望它是跨平台的。但是,我愿意接受任何建议。

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

谢谢

感谢您花时间阅读本文,并提前感谢您的帮助!

祝您节日快乐!

最佳答案

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

关于c++ - 使用 Pluma 的插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41294646/

相关文章:

linux - 如何同时 grep 多行(另一个命令的输出)?

c++ - Armadillo vector 类的 RcppArmadillo 样本

更改常量字符串 (C99)

使用 clang 编译简单的 UDP 服务器出现错误 : use of undeclared identifier 'SA'

在 Xcode 中的一个项目中创建两个子项目

c - 如何在 c 中为每个函数调用创建新线程

c++ - 我应该用 GSL 跨度替换 (void*, size) 吗?

c++ - `decltype` : function return type `T` converted to `T&` for user-defined types (VS2010)

c++ - std::forward 的实现

java - 我将使用什么语法让我的程序忽略下划线、标点符号和所有其他驼峰式命名法等