Заменяемая в горячем режиме возможная библиотека C++?

Я надеюсь "заменять библиотеку в горячем режиме" кода C++. Я интересуюсь наличием этой работы техники, кросс-платформенной между Linux/Mac/Windows. В основном я хочу иметь основную программу #include "StateMachine.h", которая определяет все вызываемые интерфейсы. Затем во времени выполнения и ВО ВРЕМЯ ВЫПОЛНЕНИЯ загружаются и разгружаются, StateMachineLibrary.a, чтобы иметь мое приложение используют различные конечные автоматы.

Одна мысль, которую я имею, возможно, чему-то нравится, пишут обертку, которая загружает этот скомпилированный код в в мою собственную malloc'd память и создает указатели функции в к той памяти?

Мотивация - то, что части Конечного автомата моего проекта будут часто изменяться и нуждаться в перекомпиляции, также позволил бы главному приложению продолжать работать с различными загружаемыми Конечными автоматами. Я надеюсь использовать "заменяемую в горячем режиме" библиотеку INSTEAD OF что-то как сценарии Lua из-за некоторых проблем, таким образом полагая, что как альтернатива был уже исследован.

10
задан Zach Burlingame 23 June 2010 в 17:50
поделиться

6 ответов

Определите базовый интерфейс и создайте из него свои реализации. Поместите их в динамические библиотеки (DLL / SO) и загрузите их во время выполнения. Библиотеке просто понадобится статическая фабричная функция, чтобы доставить вам экземпляр своей реализации.

// shared
class Base {
 public:
   virtual void DoTheWork() = 0;
};

// within the DLL/SO
class Hotplugged : public Base {
  public:
   virtual void DoTheWork() {
      std::cout<<"I got hotplugged!"<<std::endl;
   }
};

extern "C" Base* CreateIt() {
  return new Hotplugged();
} 

// within the app (sample for Windows/MSVC)
... ::LoadLibrary("mydll");
Base* (*fpCreateIt)() = (Base*(*)())::GetProcAddress(... "CreateIt");
// call the function pointer to obtain a Base instance
Base* mybase = fpCreateIt();

// prints the above text
mybase->DoTheWork(); 
delete mybase;

Примечание: это всего лишь набросок. У него есть некоторые недостатки, например, я игнорирую семантику владения, и никаких фактических проверок не выполняется, если только что загруженная DLL является двоично совместимой с нами. Подумайте немного об этом или поищите существующие реализации (некоторые упомянуты в других ответах).

17
ответ дан 3 December 2019 в 15:05
поделиться

Хотя многие его части уже устарели, в Advanced C++ Programming Styles and Idioms (James Coplien) есть раздел о том, как делать такие вещи, который может быть полезно прочитать (хотя я не уверен, что купил бы копию только ради этого).

2
ответ дан 3 December 2019 в 15:05
поделиться

Да, конечно, возможно. В предыдущей роли, где мы разрабатывали API и приложения для 3D-графики, мы позволяли пользователю выбирать драйвер дисплея «на лету». Представление необходимо было воссоздать, но само приложение не нужно было закрывать.

2
ответ дан 3 December 2019 в 15:05
поделиться

Это возможно. Для кросс-платформенной работы (по крайней мере, только для перекомпиляции) вам может потребоваться взглянуть на некоторые существующие фреймворки, которые это делают.

OpenSceneGraph включает полнофункциональную реализацию с возможностью «горячего подключения» для загрузки и выгрузки подключаемых модулей.

Qt также имеет структуру подключаемых модулей .

«Уловка» состоит в том, чтобы иметь чистый интерфейс для ваших плагинов и просто использовать динамические библиотеки, которые можно загружать и выгружать. Практически все платформы (все основные) поддерживают динамическую загрузку и выгрузку библиотек, поэтому ничто не мешает этому работать.

6
ответ дан 3 December 2019 в 15:05
поделиться

Посмотрите Boost.Reflection и Boost.Extension - они были разработаны для решения различных проблем, связанных с попытками создания подобных вещей. Я уверен, что они все еще не позволяют работать с разными компиляторами или версиями, но они могут быть вам полезны.

2
ответ дан 3 December 2019 в 15:05
поделиться

И не забывайте о XPCOM. Он разработан как кроссплатформенный COM.

0
ответ дан 3 December 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: