Статические и динамические библиотеки

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

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

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

В большинстве случаев динамические библиотеки считались лучшим подходом, но изначально у них был серьезный недостаток (ад Google DLL), который был почти устранен более поздними ОС Windows (в частности, Windows XP).

Создание статических библиотек

$$:~/static [32]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/static [33]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H
void foo();
#endif
$$:~/static [34]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/static [35]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H
void foo2();
#endif
$$:~/static [36]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/static [37]> cat makefile
hello: hello.o libtest.a
        cc -o hello hello.o -L. -ltest
hello.o: hello.c
        cc -c hello.c -I`pwd`
libtest.a:foo.o foo2.o
        ar cr libtest.a foo.o foo2.o
foo.o:foo.c
        cc -c foo.c
foo2.o:foo.c
        cc -c foo2.c
clean:
        rm -f foo.o foo2.o libtest.a hello.o
$$:~/static [38]>

Создание динамической библиотеки

$$:~/dynamic [44]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/dynamic [45]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H
void foo();
#endif
$$:~/dynamic [46]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/dynamic [47]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H
void foo2();
#endif
$$:~/dynamic [48]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/dynamic [49]> cat makefile
hello:hello.o libtest.sl
        cc -o hello hello.o -L`pwd` -ltest
hello.o:
        cc -c -b hello.c -I`pwd`
libtest.sl:foo.o foo2.o
        cc -G -b -o libtest.sl foo.o foo2.o
foo.o:foo.c
        cc -c -b foo.c
foo2.o:foo.c
        cc -c -b foo2.c
clean:
        rm -f libtest.sl foo.o foo
2.o hello.o
$$:~/dynamic [50]>

Различия между общими и статическими библиотеками?

Статические библиотеки

Преимущества:

  • Скорость
  • Весь код для выполнения файла находится в одном исполняемом файле с минимальными или практически нулевыми проблемами совместимости.

Недостатки:

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

Динамические библиотеки:

Преимущества:

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

Недостатки:

  • Более медленное время выполнения по сравнению со статическими библиотеками
  • Потенциальные проблемы совместимости, если библиотека изменена без перекомпиляции библиотеки в память