.dll
або .so
мають спільні лібри (пов'язані під час виконання), а .a
та.lib
в є статичною бібліотекою (пов'язаною під час компіляції). Це не має різниці між Windows та Linux.
Різниця полягає в тому, як вони поводяться. Примітка: різниця лише в звичаях, як вони використовуються. Було б не надто важко зробити Linux будувати за допомогою Windows і навпаки, за винятком того, що практично ніхто цього не робить.
Якщо ми використовуємо dll або називаємо функцію навіть із власного двійкового файлу, існує простий і зрозумілий спосіб. Наприклад, в С ми бачимо, що:
int example(int x) {
...do_something...
}
int ret = example(42);
Однак на рівні зорі може бути багато відмінностей. Наприклад, на x86 call
виконується код коду, а 42
на стеці - дані. Або в деяких регістрах. Або де завгодно. Ніхто цього не знає, перш ніж писати dll , як , як він буде використовуватися. Або як проекти захочуть використовувати його, можливо, написане компілятором (або мовою!), Який навіть зараз не існує (або це невідомо розробникам DLL).
Наприклад, за замовчуванням і C, і Pascal ставлять аргументи (і отримують значення повернення) зі стека - але вони роблять це в іншому порядку . Ви також можете обмінятися аргументами між своїми функціями в регістрах шляхом деяких - залежних від компілятора - оптимізації.
Як ви бачите правильно, звичайним для Windows є те, що будуючи dll, ми також створюємо мінімум .a
/ .lib
з ним. Ця мінімальна статична бібліотека - лише обгортка, символи (функції) цього dll досягаються через неї. Це робить необхідні конверсії виклику на рівні асм.
Його перевага - сумісність. Його недолік полягає в тому, що якщо у вас є лише .dll, ви можете важко розібратися, як його функції хочуть викликати. Це робить використання dlls хакерським завданням, якщо розробник DLL не дає вам.a
. Таким чином, він служить переважно цілям закритості, наприклад, так легше отримати додаткові грошові кошти для SDK.
Ще один його недолік - навіть якщо ви використовуєте динамічну бібліотеку, вам потрібно зібрати цю маленьку обгортку статично.
У Linux бінарний інтерфейс dlls є стандартним і відповідає конвенції C. Таким чином, не .a
потрібно, і існує бінарна сумісність між спільними конвертами, в обмін на це ми не маємо переваг користувальницького режиму Microsoft.