Возможна ли горячая замена библиотеки C ++? - PullRequest
10 голосов
/ 23 июня 2010

Я ищу "горячую замену" библиотеки кода на C ++.Я заинтересован в том, чтобы эта техника работала кроссплатформенно между Linux / Mac / Windows.В основном я хочу иметь основную программу #include "StateMachine.h", которая определяет все вызываемые интерфейсы.Затем во время выполнения и DURING EXECUTION загрузите и выгрузите StateMachineLibrary.a, чтобы мое приложение использовало разные конечные автоматы.

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

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

Ответы [ 7 ]

17 голосов
/ 23 июня 2010

Определите базовый интерфейс и извлеките из него ваши реализации.Поместите их в динамические библиотеки (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 совместима с нами в двоичном формате.Подумайте об этом немного или поищите существующие реализации (некоторые упоминаются в других ответах).

6 голосов
/ 23 июня 2010

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

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

Qt также имеет каркас плагинов .

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

2 голосов
/ 23 июня 2010

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

2 голосов
/ 23 июня 2010

Хотя многие его части довольно устарели, Расширенные стили и идиомы программирования на C ++ (Джеймс Коплиен) имеет раздел о том, как делать такие вещи, которые могут быть полезны для чтения (хотя я не уверен, что я купил бы копию просто для этого).

2 голосов
/ 23 июня 2010

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

1 голос
/ 28 февраля 2011

Первоначально я написал v3c-dcom, просто чтобы посмотреть, смогу ли я это сделать - вы можете скачать его с Sourceforge.
на данный момент это просто подключаемая система.
Это зависит от трех других проектов SourceForge, поэтому вам придется сначала загрузить и установить их.

Перейдите на SourceForge http://sourceforge.net/ и загрузите следующие проекты:
* v3c
* treedb
* meta-treedb
* v3c-dcom

v3c содержит систему сборки и общую библиотеку утилит.
treedb содержит базовую функциональность «постоянная память».
meta-treedb оборачивает встроенные реализации treedb в общий формат, сокращая время компиляции и раздувание кода.
v3c-dcom содержит несколько примеров, включая создание хранилища плагинов внутри программы, добавление библиотеки в хранилище, вызов CoCreateInstance() для создания объектов и вызов методов для этих объектов.

Я спроектировал систему сборки так, чтобы она была удобной для пользователя, хотя она и основана на автоматизированных системах;)

Просто сделайте make && sudo make install в распакованных каталогах каждого проекта по очереди.

Если вы параноик или у вас нет привилегий "sudo", прочтите README v3c и скрипт "tryout" о том, как распаковать / собрать / установить пакеты в вашей собственной директории.

make check будет запускать каждую библиотеку в нужном темпе, а для v3c-dcom - демонстрацию, о которой я упоминал выше.

Надеюсь, это поможет.

0 голосов
/ 23 июня 2010

И не забудьте XPCOM.Он предназначен для кроссплатформенного COM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...