- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
概览
我正在尝试开发一个允许用户创建插件的 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 ,我注意到:
在你的 RNCypher.h 文件中你错过了类似的东西
PLUMA_INHERIT_PROVIDER(RNCypher, CryptoBase)
似乎也没有文件 CryptoBase.cpp 包含类似
#include "CryptoBase.h"
PLUMA_PROVIDER_SOURCE(CryptoBase, 1, 1);
最后,在 CryptoBase.h 中,我将声明一个虚拟析构函数(参见 Why should I declare a virtual destructor for an abstract class in C++? )并为其提供定义,而您不应在未为其提供定义的情况下声明默认构造函数(例如参见 Is it correct to use declaration only for empty private constructors in C++? );当然,最后的考虑是有效的,除非您在另一个文件中提供了此类定义。
关于c++ - 使用 Pluma 的插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41294646/
概览 我正在尝试开发一个允许用户创建插件的 C++ 应用程序。 我发现了一个名为 Pluma ( http://pluma-framework.sourceforge.net/ ) 的不错的库,它在功
有没有办法注释掉 Pluma 中的代码块(显然是 Gedit 分支)?例如在 python 中,我想选择一个代码块: def foo(bar): return bar * 2 并将其注释掉:
那太好了。虽然我找不到一个使用谷歌。有人听说过或看过 Pluma 的东西或想制作一个插件吗? (Pluma 是 Mate Desktop 的文本编辑器。Mate Desktop 是 Gnome 2 的
我是一名优秀的程序员,十分优秀!