Подтвердить что ты не робот

Разница между модулями и разделяемыми библиотеками?

Название в основном покрывает его, в чем разница между модулем и разделяемой библиотекой? Я просто нашел это различие в команде CMake add_library, где они говорят:

Библиотеки SHARED динамически связаны и загружаются во время выполнения. Библиотеки MODULE - это плагины, которые не связаны с другими объектами, но могут быть загружены динамически во время выполнения, используя функции, похожие на dlopen.

Но я могу загрузить общий объект с помощью dlopen(), не могу ли я?

4b9b3361

Ответ 1

Разница в том, что вы можете ссылаться на библиотеку SHARED с компоновщиком, но вы не можете ссылаться на МОДУЛЬ с компоновщиком. На некоторых платформах.

Итак... чтобы быть полностью кросс-платформенным и работать везде, где работает CMake, вы никогда не должны этого делать:

# This is a big NO-NO:
add_library(mylib MODULE ${srcs})
target_link_libraries(myexe mylib)

Справедливости ради, в Windows они оба являются просто DLL, и поэтому этот код может работать. Но когда вы берете его на платформу, где невозможно связать с МОДУЛЕЙ, вы столкнетесь с ошибкой.

Нижняя строка: если вам нужно установить ссылку на библиотеку, используйте SHARED. Если вам гарантировано, что библиотека будет загружаться только динамически, тогда безопасно использовать МОДУЛЬ. (И, возможно, даже предпочтительнее определить, пытается ли кто-нибудь попытаться связать с ним...)

Ответ 2

Я думаю, что различие заключается в том, что общие библиотеки указываются разработчиком во время компиляции и должны присутствовать для запуска приложения, даже если их методы загружаются во время выполнения. Модуль, то есть плагин, добавляет дополнительную поддержку во время выполнения, но не требуется. Да, вы можете использовать dlopen() совместно используемую библиотеку, но в этом случае она не была бы указана как обязательная часть программы и вместо нее функционирует как модуль.

Ответ 3

Еще одно отличие в том, как ..._OUTPUT_DIRECTORY и ..._OUTPUT_NAME обрабатываются:

Библиотеки модулей всегда рассматриваются как цели библиотеки. Для не-DLL-платформ общие библиотеки рассматриваются как объекты библиотеки. Для DLL-платформ часть DLL для общей библиотеки рассматривается как целевая среда выполнения, а соответствующая библиотека импорта рассматривается как цель архива. Все системы на базе Windows, включая Cygwin, являются платформами DLL.

Например, это означает, что если вы скомпилируете библиотеку SHARED в Windows, LIBRARY_OUTPUT_DIRECTORY будет проигнорирована, потому что она ищет вместо ARCHIVE_OUTPUT_DIRECTORY и RUNTIME_OUTPUT_DIRECTORY.