概述
我正在尝试开发一个允许用户创建插件的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
#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_INCLUDEDH(这是插件的一部分)
#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_INCLUDEDmain.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;
}附加细节
我正在Ubuntu16.04上编译,使用代码::块16.01。
第二条错误消息似乎不是来自Pluma本身,而是一个我还必须链接的文件,#include <dlfcn.h> (可能是一个Linux文件?)。
我更喜欢使用现有的库,而不是编写自己的代码,因为我希望这是跨平台的。不过,我对任何建议都持开放态度。
对不起,所有的代码,但我相信,这是足够复制错误,我有。
谢谢
感谢您抽出时间阅读这篇文章,并提前感谢您的帮助!
祝大家节日愉快!
发布于 2017-01-05 12:00:54
我无法重现您的问题,但是看看http://pluma-framework.sourceforge.net/documentation/index.htm,我注意到:
https://stackoverflow.com/questions/41294646
复制相似问题