插件使用Pluma
Plugins using Pluma
概述
我正在尝试开发允许用户创建插件的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 中的空私有构造函数使用声明是正确的吗?);当然,除非有另一个文件提供了此类定义,否则最后一个考虑是有效的。
- 从C++本机插件更新Vector3数组
- 使用CMake创建QML插件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- clang 插件:在编译过程中修改 AST
- 实现动态插件管理器
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- Agora.io 虚幻引擎插件构建错误
- 使用带有C++对象和标准库容器的插件系统
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 如何为模块化应用程序实现C++插件系统
- 'string'文件在带有C++文件的iOS插件上找不到
- 在 Android 上安装 GStreamer 插件
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 如何在 Windows 操作系统中在 geany 中安装插件
- 节点插件 API 将数组作为函数参数传递
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 插件使用Pluma