Нужны ли статические библиотеки для статической ссылки? - PullRequest
9 голосов
/ 20 июня 2009

На 'C', Linux,

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

Ответы [ 4 ]

11 голосов
/ 20 июня 2009

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

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

Динамические библиотеки уже связаны. Это означает, что некоторая информация, такая как перемещение, уже исправлена ​​и выброшена.

Кроме того, динамические библиотеки должны быть скомпилированы как позиционно-независимый код. Это не является ограничением для статических библиотек и приводит к значительной разнице в производительности на некоторых распространенных платформах (например, x86).

Существуют такие инструменты, как ELF Statifier , которые пытаются объединить динамически связанные библиотеки в динамически связанный исполняемый файл, но при любых обстоятельствах очень трудно создать правильно работающий результат.

6 голосов
/ 20 июня 2009

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

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

2 голосов
/ 20 июня 2009

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

1 голос
/ 23 июля 2009

Другим вариантом является горностай (http://magicErmine.com) Это как стабилизатор, но может справиться с рандомизацией памяти.

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