Я надеюсь "заменять библиотеку в горячем режиме" кода C++. Я интересуюсь наличием этой работы техники, кросс-платформенной между Linux/Mac/Windows. В основном я хочу иметь основную программу #include "StateMachine.h", которая определяет все вызываемые интерфейсы. Затем во времени выполнения и ВО ВРЕМЯ ВЫПОЛНЕНИЯ загружаются и разгружаются, StateMachineLibrary.a, чтобы иметь мое приложение используют различные конечные автоматы.
Одна мысль, которую я имею, возможно, чему-то нравится, пишут обертку, которая загружает этот скомпилированный код в в мою собственную malloc'd память и создает указатели функции в к той памяти?
Мотивация - то, что части Конечного автомата моего проекта будут часто изменяться и нуждаться в перекомпиляции, также позволил бы главному приложению продолжать работать с различными загружаемыми Конечными автоматами. Я надеюсь использовать "заменяемую в горячем режиме" библиотеку INSTEAD OF что-то как сценарии Lua из-за некоторых проблем, таким образом полагая, что как альтернатива был уже исследован.
Определите базовый интерфейс и создайте из него свои реализации. Поместите их в динамические библиотеки (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 является двоично совместимой с нами. Подумайте немного об этом или поищите существующие реализации (некоторые упомянуты в других ответах).
Хотя многие его части уже устарели, в Advanced C++ Programming Styles and Idioms (James Coplien) есть раздел о том, как делать такие вещи, который может быть полезно прочитать (хотя я не уверен, что купил бы копию только ради этого).
Да, конечно, возможно. В предыдущей роли, где мы разрабатывали API и приложения для 3D-графики, мы позволяли пользователю выбирать драйвер дисплея «на лету». Представление необходимо было воссоздать, но само приложение не нужно было закрывать.
Это возможно. Для кросс-платформенной работы (по крайней мере, только для перекомпиляции) вам может потребоваться взглянуть на некоторые существующие фреймворки, которые это делают.
OpenSceneGraph включает полнофункциональную реализацию с возможностью «горячего подключения» для загрузки и выгрузки подключаемых модулей.
Qt также имеет структуру подключаемых модулей .
«Уловка» состоит в том, чтобы иметь чистый интерфейс для ваших плагинов и просто использовать динамические библиотеки, которые можно загружать и выгружать. Практически все платформы (все основные) поддерживают динамическую загрузку и выгрузку библиотек, поэтому ничто не мешает этому работать.
Посмотрите Boost.Reflection и Boost.Extension - они были разработаны для решения различных проблем, связанных с попытками создания подобных вещей. Я уверен, что они все еще не позволяют работать с разными компиляторами или версиями, но они могут быть вам полезны.
И не забывайте о XPCOM. Он разработан как кроссплатформенный COM.