Когда использовать динамические и статические библиотеки

Да, вы должны передать указатель на указатель. C передает аргументы по значению, а не по ссылке.

418
задан Raedwald 21 December 2018 в 15:46
поделиться

15 ответов

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

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

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

библиотеки Dynamic считались лучшим подходом большую часть времени, но первоначально у них был главный дефект (ад google DLL), который был почти устранен более свежим Windows OSes (Windows XP в особенности).

287
ответ дан Orion Adrian 21 December 2018 в 15:46
поделиться

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

2
ответ дан Robert Gould 21 December 2018 в 15:46
поделиться

Статические библиотеки являются архивами, которые содержат объектный код для библиотеки, когда связано в приложение, что код компилируется в исполняемый файл. Общие библиотеки отличаются в этом, они не компилируются в исполняемый файл. Вместо этого динамический компоновщик ищет некоторые каталоги, ища библиотеку (библиотеки), она нуждается, затем загружает это в память. Более тогда один исполняемый файл может пользоваться той же общей библиотекой одновременно, таким образом уменьшая использование памяти и исполняемый размер. Однако существует тогда больше файлов для распределения с исполняемым файлом. Необходимо удостовериться, что библиотека установлена на систему использования где-нибудь, где компоновщик может найти его, статическое подключение устраняет эту проблему, но приводит к большему исполняемому файлу.

2
ответ дан Terence Simpson 21 December 2018 в 15:46
поделиться

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

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

, Если можно жить со статической библиотекой, пойдите со статической библиотекой.

3
ответ дан Seb Rose 21 December 2018 в 15:46
поделиться

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

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

3
ответ дан Dima 21 December 2018 в 15:46
поделиться

Поскольку превосходное обсуждение этой темы имеет чтение эта статья от Sun.

Это входит во все преимущества включая способность ввести вмешивающиеся библиотеки. Больше детали о вставке может быть найдено в эта статья здесь .

5
ответ дан Rob Wells 21 December 2018 в 15:46
поделиться

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

4
ответ дан pfranza 21 December 2018 в 15:46
поделиться

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

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

12
ответ дан Jordan Parmer 21 December 2018 в 15:46
поделиться

Необходимо ли думать тщательно об изменениях со временем, управлении версиями, устойчивости, совместимости, и т.д.

, Если существует два приложения, которые используют общий код, Вы хотите вынудить те приложения измениться вместе, в случае, если они должны быть совместимы друг с другом? Тогда используйте dll. Весь exe's будет использовать тот же код.

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

ад DLL - когда, вероятно, НЕОБХОДИМО было использовать статический lib, но Вы использовали dll вместо этого, и не весь exes совместимы с ним.

13
ответ дан Corey Trager 21 December 2018 в 15:46
поделиться

Lib является единицей кода, который связывается в Вашем исполняемом файле приложения.

А dll является автономной единицей исполняемого кода. Это загружается в процессе только, когда вызов превращен в тот код. dll может использоваться несколькими приложениями и загружаться в нескольких процессах, все еще имея только одну копию кода жесткого диска.

профессионалы Dll : может привыкнуть к коду повторного использования/доли между несколькими продуктами; загрузка в памяти процесса по требованию и может быть разгружена если не необходимая; может быть обновлен независимо от остальной части программы.

недостатки Dll : влияние производительности загрузки dll и перебазирования кода; проблемы управления версиями ("dll ад")

профессионалы Lib : никакое влияние производительности как код всегда не загружается в процессе и не перебазирующееся; никакие проблемы управления версиями.

недостатки Lib : исполняемый файл/процесс "чрезмерно увеличивается в размерах" - весь код находится в Вашем исполняемом файле и загружается после процесса, запускаются; никакое повторное использование/совместное использование - каждый продукт имеет свою собственную копию кода.

60
ответ дан Anirudh Ramanathan 21 December 2018 в 15:46
поделиться

Другие соответственно объяснили, какова статическая библиотека, но я хотел бы указать на некоторые протесты пользования статическими библиотеками, по крайней мере, в Windows:

  • Одиночные элементы: , Если что-то должно быть глобальным/статичным и уникальным, быть очень осторожным относительно помещения его в статической библиотеке. Если несколько DLLs будут связаны против той статической библиотеки, то они каждый получат свою собственную копию одиночного элемента. Однако, если Ваше приложение является единственным EXE без пользовательского DLLs, это не может быть проблемой.

  • Не имеющее ссылки удаление кода: , Когда Вы связываетесь против статической библиотеки, только части статической библиотеки, на которые ссылается Ваш DLL/EXE, будут связаны в Ваш DLL/EXE.

    , Например, если mylib.lib содержит a.obj и b.obj и Ваш DLL/EXE только ссылочные функции или переменные от a.obj, полнота b.obj будет отброшена компоновщиком. Если b.obj будет содержать глобальные / статические объекты, их конструкторы и деструкторы не будут выполняться. Если у тех конструкторов/деструкторов есть побочные эффекты, Вы можете быть разочарованы их отсутствием.

    Аналогично, если статическая библиотека содержит специальный entrypoints, Вы, возможно, должны заботиться, что они на самом деле включены. Примером этого во встроенном программировании (хорошо, не Windows) был бы обработчик прерываний, который отмечен как являющийся в определенном адресе. Также необходимо отметить обработчика прерываний как entrypoint, чтобы удостовериться, что это не становится отброшенным.

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

  • Отладочные символы: можно хотеть отдельный PDB для каждой статической библиотеки, или можно хотеть, чтобы отладочные символы были помещены в объектные файлы так, чтобы они были прокручены в PDB для DLL/EXE. Документация Visual C++ объясняет необходимые опции .

  • RTTI: можно закончить с [приблизительно 116] объекты для того же класса при соединении единственной статической библиотеки в несколько DLLs. Если Ваша программа предполагает, что type_info "одноэлементные" данные и используют &typeid() или type_info::before(), можно получить нежелательные и неожиданные результаты.

184
ответ дан bk1e 21 December 2018 в 15:46
поделиться

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

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

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

9
ответ дан spotcatbug 21 December 2018 в 15:46
поделиться

Статья Ульриха Дреппера « Как писать общие библиотеки » также является хорошим ресурсом, в котором подробно описывается, как лучше всего использовать преимущества общих библиотек или то, что он называет «динамическими Общие объекты »(DSO). В нем больше внимания уделяется разделяемым библиотекам в двоичном формате ELF , но некоторые обсуждения подходят и для Windows DLL.

7
ответ дан 22 November 2019 в 23:20
поделиться

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

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

Это становится гораздо более важной проблемой, если вы решаете, например, как скомпилировать свои мобильные приложения. (в Android у вас есть выбор между статическим и динамическим, в iOS его нет - он всегда статичен).

23
ответ дан 22 November 2019 в 23:20
поделиться

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

$$:~/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]>
18
ответ дан 22 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: