общие библиотеки — Как сообщить компоновщику c ++, что некоторые классы будут добавлены позже dlopen

У меня есть устаревший код C ++, я пытаюсь его переделать.

Я хочу извлечь некоторую часть кода из проекта в виде разделяемой библиотеки «.so» и загружать их динамически с помощью «dlopen».

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

Теперь я хочу отделить существующие модули от основного проекта.

Например, я извлек модуль «X» из основного проекта и создал общую библиотеку, которую можно загрузить позже, но некоторая часть основного проекта использует классы модуля X напрямую, и я пока не могу их изменить.

Я могу скомпилировать проект, используя заголовочные файлы модуля X, но компоновщик выдает ошибку «неопределенная ссылка».

Как я могу сказать компоновщику c ++, что эти классы будут добавлены позже механизмом dlopen во время выполнения?

примечание: я могу связать и запустить проект, скопировав созданный файл «.so» модуля X в папку «/ lib» и использовать его при связывании с флагом «-lX», но если я удаляю этот файл из папки / lib, проект не удается при запуске.

0

Решение

Я знаю, что если вы используете классы X напрямую, вам нужно связать X.so с вашей программой. Но если вы связываете X.so, вы можете использовать dlopen во время выполнения.

0

Другие решения

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

Импорт библиотек — это стандартная функция DLL-библиотек Windows, но они недоступны в Linux (или в любой системе POSIX). Вы можете реализовать обертки вручную или использовать Implib.so генерировать их автоматически.

0

По вопросам рекламы [email protected]