
Статические и динамические библиотеки
Статические библиотеки увеличивают размер кода в вашем двоичном файле. Они всегда загружаются, и любая версия кода, с которой вы скомпилировали, является версией кода, который будет работать.
Динамические библиотеки хранятся и управляются отдельно. Возможна загрузка версии динамической библиотеки, отличной от исходной версии, поставляемой с вашим кодом, если обновление считается двоично-совместимым с исходной версией.
Кроме того, динамические библиотеки не обязательно загружаются — они обычно загружаются при первом вызове — и могут совместно использоваться компонентами, использующими одну и ту же библиотеку (многократная загрузка данных, одна загрузка кода).
В большинстве случаев динамические библиотеки считались лучшим подходом, но изначально у них был серьезный недостаток (ад 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]>
Различия между общими и статическими библиотеками?
Статические библиотеки
Преимущества:
- Скорость
- Весь код для выполнения файла находится в одном исполняемом файле с минимальными или практически нулевыми проблемами совместимости.
Недостатки:
- Постоянное время загрузки каждый раз, когда файл компилируется и перекомпилируется
- Больше по размеру, потому что файл приходится перекомпилировать каждый раз при добавлении нового кода в исполняемый файл
Динамические библиотеки:
Преимущества:
- В памяти хранится только одна копия общей библиотеки, что значительно ускоряет компиляцию программ и значительно уменьшает размер исполняемой программы.
- Время загрузки динамической компоновки будет сокращено, если код общей библиотеки уже присутствует в памяти.
Недостатки:
- Более медленное время выполнения по сравнению со статическими библиотеками
- Потенциальные проблемы совместимости, если библиотека изменена без перекомпиляции библиотеки в память