Разница между статической связью и динамической связью - PullRequest
13 голосов
/ 11 ноября 2010

В чем разница между статической и динамической связью?

Ответы [ 5 ]

16 голосов
/ 11 ноября 2010

При статическом связывании функции и переменные, которые определены во внешних файлах библиотеки, связаны внутри вашего исполняемого файла.Это означает, что код фактически связан с вашим кодом при компиляции / компоновке.

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

На платформах Windows вы даже можете явно загружать файлы DLL во время выполнения и подключать функции, содержащиеся в DLL.

12 голосов
/ 11 ноября 2010

Статическое связывание выполняется во время компиляции с помощью инструмента, называемого компоновщиком. Динамическое связывание выполняется во время выполнения операционной системой.

2 голосов
/ 04 декабря 2013

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

0 голосов
/ 12 марта 2019

Если мы скомпилируем простую программу helloworld со статическим и динамическим связыванием, мы легко увидим разницу в размере, как показано ниже,

#include <stdio.h>
int main(int argc, char **argv) {
    printf("Hello World !");
    return 0;
}

Создайте динамически связанный исполняемый файл как,

$ gcc -o helloworld helloworld.c 

Кроме того, создайте статически связанный исполняемый файл как

$ gcc -o helloworld_static helloworld.c -static 
$ ls -alh helloworld
-rwxrwxr-x 1 myuser myuser 7.2K Sep  2 21:08 helloworld 
$ size helloworld
   text    data     bss     dec     hex filename
   1124     276       4    1404     57c helloworld
$ ls -alh helloworld_static 
-rwxrwxr-x 1 myuser myuser 712K Sep  2 21:08 helloworld_static
$ size helloworld_static    text      data     bss     dec     hex filename
 658287    4096    3644  666027   a29ab helloworld_static

, следовательно, наблюдения за выполнением простой программы helloworld следующие,

  • Статически связанный исполняемый файл требует больше места по сравнению с динамически связанным исполняемым файлом.Недостаток статического компоновки и преимущество динамического компоновки.

  • Для динамически связанных исполняемых файлов в памяти находится только одна копия общей библиотеки.Если несколько процессов вызывают один и тот же объектный модуль общей библиотеки одновременно, все они используют одну и ту же копию библиотеки.Принимая во внимание, что для статического связывания все используемые объекты библиотеки копируются в каждый исполняемый файл.Таким образом, копии каждого библиотечного объекта находятся в памяти для каждого из различных процессов.Это приводит к увеличению объема оперативной памяти, используемой для исполняемых файлов со статической связью, чем для динамически связанных исполняемых файлов.

  • Для динамического связывания требуется больше системных вызовов, что означает, что для динамически связанных исполняемых файлов потребуется больше времени для запуска /выполнение.

Если вы хотите более подробное объяснение, с фактической трассировкой системного вызова с использованием strace во время выполнения программы, вы можете посетить страницу, на которой я писал об этой проблемемой сайт .

0 голосов
/ 25 августа 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...