Связь файла объекта общей библиотеки - PullRequest
0 голосов
/ 12 июля 2011

Меня интересуют решения по приведенному ниже вопросу для Linux и Windows, GCC, MinGW и MSVC (если возможно).

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

Пока что все пользовательские модули полностью состоят из самодостаточного кода. То есть объектные файлы, составляющие DLL / SO, не дали неполных ссылок с точки зрения компоновщика.

Нет. Я хочу разрешить модулям использовать функции, скомпилированные в объектные файлы, которые составляют двоичное приложение, импортирующее эти модули. Другими словами, Я хочу разрешить им использовать часть кода моей библиотеки без необходимости компилирования в саму DLL / SO. К сожалению, на этапе компоновки при сборке DLL / SO это не удается с жалобой на наличие неразрешенных символов.

Возможно ли это?

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

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

1 голос
/ 13 июля 2011

Что касается Linux и других платформ ELF, это вполне возможно. Вам просто нужно экспортировать соответствующие символы из вашего исполняемого файла, и они будут предпочтительнее тех же символов в динамической библиотеке. Подробнее см. этот вопрос .

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

1 голос
/ 12 июля 2011

почему бы просто не создать DLL, которая связана как с основным приложением, так и со всеми пользовательскими библиотеками ... это совершенно законно, безопасно и делает то, что вы хотите AFAICT.

0 голосов
/ 12 июля 2011

Моя первая мысль: найти другой способ сделать это ... требовать, чтобы надстройки взаимодействовали через интерфейс известного типа, и тогда не нужно будет пытаться обмануть компоновщик ...

...