Я брав участь у дебатах щодо бібліотек в Linux, і хотів би підтвердити деякі речі.
Наскільки я розумію (будь ласка, виправте мене, якщо я помиляюся, і я відредагую свою публікацію пізніше), є два способи використання бібліотек під час створення програми:
- Статичні бібліотеки (файли .a): під час посилання копія всієї бібліотеки вводиться в остаточну програму, щоб функції в бібліотеці завжди були доступні для виклику програми
- Спільні об'єкти (.so файли): під час посилання об’єкт просто перевіряється щодо його API через відповідний заголовок (.h) файл. Бібліотека насправді не використовується до часу виконання, де це потрібно.
Очевидною перевагою статичних бібліотек є те, що вони дозволяють весь додаток бути автономним, тоді як перевага динамічних бібліотек полягає в тому, що файл ".so" можна замінити (тобто: у випадку, якщо він потребує оновлення через захист помилка), не вимагаючи перекомпілювати базову програму.
Я чув, як деякі люди розрізняють спільні об'єкти та динамічні пов'язані бібліотеки (DLL), хоча вони є файлами ".so". Чи є різниця між спільними об'єктами та DLL, якщо мова йде про розробку C / C ++ на Linux або будь-яку іншу ОС, сумісну з POSIX (тобто: MINIX, UNIX, QNX тощо)? Мені кажуть, що одна з ключових відмінностей (поки що) полягає в тому, що спільні об'єкти просто використовуються під час виконання, тоді як DLL-файли повинні бути відкриті спочатку за допомогою виклику dlopen () у програмі.
Нарешті, я також чув, як деякі розробники згадують "спільні архіви", які, наскільки я розумію, також є самими статичними бібліотеками, але ніколи не використовуються додатком безпосередньо. Натомість інші статичні бібліотеки пов'язуватимуться із "спільними архівами", щоб перетягнути деякі (але не всі) функції / ресурси зі спільного архіву у статичну бібліотеку, що будується.
Заздалегідь дякую всім за допомогу.
Оновлення
У контексті, в якому ці терміни були мені надані, фактично помилкові терміни використовували команда розробників Windows, яка мала вивчити Linux. Я намагався їх виправити, але (неправильні) мовні норми застрягли.
- Shared Object: Бібліотека, яка автоматично приєднується до програми при запуску програми і існує як окремий файл. Бібліотека включається до списку посилань під час компіляції (тобто
LDOPTS+=-lmylib
для файлу бібліотеки з назвоюmylib.so
). Бібліотека повинна бути присутнім під час компіляції та при запуску програми. - Статична бібліотека: бібліотека, яка об'єднується у фактичну програму сама під час збирання для однієї (більшої) програми, що містить код програми та код бібліотеки, який автоматично приєднується до програми під час створення програми, і кінцевий бінарний файл, що містить обидва основна програма і сама бібліотека існує як єдиний окремий бінарний файл. Бібліотека включається до списку посилань під час компіляції (тобто
LDOPTS+=-lmylib
для файлу бібліотеки з назвою mylib.a). Бібліотека повинна бути присутнім під час компіляції. - DLL: По суті такий же, як спільний об'єкт, але замість того, щоб бути включеним у список зв’язків під час компіляції, бібліотека завантажується через
dlopen()
/dlsym()
команди, так що бібліотеці не потрібно бути присутнім під час збирання програми для компіляції. Крім того, бібліотеці не потрібно бути присутнім (обов'язково) при запуску програми або компіляції програми , оскільки це потрібно лише в момент здійсненняdlopen
/dlsym
викликів. - Спільний архів: По суті такий же, як і статична бібліотека, але складається з прапорами "експорт-спільний" та "-fPIC". Бібліотека включається до списку посилань під час компіляції (тобто
LDOPTS+=-lmylibS
для файлу бібліотеки з назвоюmylibS.a
). Відмінність між ними полягає в тому, що цей додатковий прапор необхідний, якщо спільний об'єкт або DLL хочуть статично пов’язати спільний архів у власному коді ТА мати можливість зробити функції спільного об'єкта доступними для інших програм, а не просто використовувати їх внутрішній для DLL. Це корисно в тому випадку, коли хтось надає вам статичну бібліотеку, і ви хочете перепакувати її як SO. Бібліотека повинна бути присутнім під час компіляції.
Додаткове оновлення
Розмежування " DLL
" і " shared library
" було просто (ледачим, неточним) розмовою в компанії, в якій я працював у той час (розробники Windows змушені переходити на розробку Linux, а термін застряг), дотримуючись описаних вище описів.
До того ж, " S
" буквальне значення після назви бібліотеки, що стосується "спільних архівів", було лише умовою, що використовується в цій компанії, а не в галузі взагалі.
.a
файлів "a" насправді означає "archove", і це просто архів файлів об'єктів. Сучасні посилання мають бути досить хорошими, щоб не потрібно включати бібліотеку в той час, як потрібні файли об'єктів в архіві, який потрібен, і навіть можуть просто використовувати розділи коду / даних у файлах об'єктів, на які посилаються.