Почему размер exe-файла больше, когда мы используем статическую библиотеку, а не разделяемую библиотеку - PullRequest
1 голос
/ 12 июля 2011

У меня возник вопрос по поводу разделяемых и статических библиотек. Итак, позвольте мне рассказать вам, что я сделал, я создал статическую библиотеку, а также разделяемую библиотеку, используя команды gcc, а размер libarith.a составляет 6 КБ и размер libarith.so - 18 КБ. Оба библиотеки содержат одинаковые функции.

Я использовал одну простую функцию (скажем, add (a, b)) в своем файле make.c и связал статическую библиотеку с помощью этой команды gcc,

           gcc -L/cygdrive/c/cpros make.c -larith.a # used a static library

размер исполняемого файла составляет 16,1 КБ.

Затем я использовал ту же функцию (то же самое add (a, b)) в моем файле make.c, но на этот раз с использованием разделяемой библиотеки, как эти.

          gcc make.c /cygdrive/c/cpros/libarith.so #used a shared library

к сожалению, размер исполняемого файла составляет 12,1 КБ. Я удивляюсь, как? потому что размер libarith.so составляет 18 КБ по сравнению с libarith.a, который составляет всего 6 КБ. Но в конце исполняемый файл, сгенерированный с использованием общей библиотеки, меньше по сравнению со статической библиотекой.

Может кто-нибудь дать мне вескую причину для этого? Если разделяемые библиотеки занимают меньше памяти, то почему бы нам не использовать все время совместно используемые библиотеки. Пожалуйста, дайте мне знать, когда мы используем разделяемые библиотеки, а когда - статические.

Да, когда я создавал разделяемую библиотеку с использованием -fPIC, она давала мне код, предупреждающий о позиции предупреждения. Что на самом деле означает это предупреждение?

Ответы [ 2 ]

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

В общей библиотеке много кода перемещения, поэтому он больше статической библиотеки.

Когда вы компилируете исполняемый файл со статической библиотекой, статическая библиотека включается в исполняемый файл.,Когда вы компилируете исполняемый файл с общей библиотекой,

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

Вы также путаете два термина.Память! = Хранение.На диске общая библиотека может быть больше, но после установки у вас будет только одна ее копия.С другой стороны, каждый исполняемый файл, скомпилированный со статической библиотекой, будет иметь копию статической библиотеки внутри.

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

При использовании совместно используемых библиотек код библиотечных функций не вставляется в ваш двоичный файл. Таким образом, двоичный файл меньше. Недостатком является то, что вы можете получить проблемы с несоответствием версий между приложениями и библиотеками, которые они используют (или DLL Hell ), так как связь довольно слабая.

...