Связывание загружаемых плагинов с символами в исполняемом файле в Linux и Windows - PullRequest
1 голос
/ 04 декабря 2009

Это очень на Mac, чтобы создать загружаемый плагин в виде пакета и заставить его использовать символы в исполняемом файле Host . Как это можно сделать в Linux и Windows?

Я слышал, что в Linux есть -rdynamic, который может пригодиться, но я в полном недоумении по поводу Windows.

Смысл в том, чтобы отойти от привязки хоста и плагина к общей библиотеке и к статически построенному хосту.

Ответы [ 5 ]

1 голос
/ 25 сентября 2013

Эта ссылка, вероятно, также является решением здесь: dlopen () .so не может найти символы в удаленном исполняемом файле

Основная идея заключается в использовании опции компоновщика -E (--export-dynamic) для исполняемого файла (или использовании --dynamic-list и явном именовании символов, доступных для DSO).

1 голос
/ 04 декабря 2009

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

0 голосов
/ 07 декабря 2009

Там - это способ сделать это, по-видимому, но он опирается на жестко заданную зависимость от исполняемого файла хоста.

0 голосов
/ 06 декабря 2009

Просто чтобы убедиться, что я понимаю, вы хотите иметь возможность динамически загружать и выгружать библиотеки плагинов, которые будут автоматически разрешать символы, которые определены только в главном приложении, правильно? Я не думаю, что это возможно под Windows (я не знаю о Linux). Один из вариантов - переместить функции хоста в общую статическую библиотеку, на которую все ссылаются, но это, вероятно, невозможно, потому что она должна обеспечивать специфическую для хоста функциональность. Я думаю, что единственным жизнеспособным вариантом является подход Зана.

0 голосов
/ 04 декабря 2009

Возможно, вы захотите использовать немного другую модель для Windows. Если вы используете кроссплатформенный фреймворк, вы сможете найти его в.

Функция LoadLibrary позволяет вам передать имя DLL в виде строки. Затем вы можете получить адрес различных функций в Библиотеке по их имени и указать им указатель на функцию.

...