Я пытаюсь написать что-то в С++ с такой архитектурой, как:
App → Core (.so) < - Плагины (.so's)
для linux, mac и windows. Ядро неявно связано с App и Plugins, которые явно связаны с dlopen/LoadLibrary для App. У меня проблема:
статические переменные в Core дублируются во время выполнения. Плагины и приложение имеют разные копии. по крайней мере на Mac, когда плагин возвращает указатель на приложение, динамическое кастинг, указатель в приложении всегда приводит к NULL.Может кто-нибудь дать мне несколько объяснений и инструкций для разных платформ, пожалуйста? Я знаю, что это может показаться ленивым, чтобы спросить их всех здесь, но я действительно не могу найти систематический ответ на этот вопрос.
Что я сделал в entry_point.cpp для плагина:
#include "raw_space.hpp"
#include <gamustard/gamustard.hpp>
using namespace Gamustard;
using namespace std;
namespace
{
struct GAMUSTARD_PUBLIC_API RawSpacePlugin : public Plugin
{
RawSpacePlugin(void):identifier_("com.gamustard.engine.space.RawSpacePlugin")
{
}
virtual string const& getIdentifier(void) const
{
return identifier_;
}
virtual SmartPtr<Object> createObject(std::string const& name) const
{
if(name == "RawSpace")
{
Object* obj = NEW_EX RawSpaceImp::RawSpace;
Space* space = dynamic_cast<Space*>(obj);
Log::instance().log(Log::LOG_DEBUG, "createObject: %x -> %x.", obj, space);
return SmartPtr<Object>(obj);
}
return SmartPtr<Object>();
}
private:
string identifier_;
};
SmartPtr<Plugin> __plugin__;
}
extern "C"
{
int GAMUSTARD_PUBLIC_API gamustardDLLStart(void) throw()
{
Log::instance().log(Log::LOG_DEBUG, "gamustardDLLStart");
__plugin__.reset(NEW_EX RawSpacePlugin);
PluginManager::instance().install(weaken(__plugin__));
return 0;
}
int GAMUSTARD_PUBLIC_API gamustardDLLStop(void) throw()
{
PluginManager::instance().uninstall(weaken(__plugin__));
__plugin__.reset();
Log::instance().log(Log::LOG_DEBUG, "gamustardDLLStop");
return 0;
}
}