C / C ++: В чем разница между статически связанной библиотекой и объектным файлом?

Я понимаю, что код, включенный в исполняемый файл во время компиляции, может поступать из объектных файлов (файлы .o) и статически связанных библиотек (файлы .lib / .a). В чем принципиальная и концептуальная разница между этими двумя? Почему существует различие между «объектным кодом» и «статически связанной библиотекой»? Каковы преимущества и недостатки каждого и почему использовать одно в отличие от другого? Могут ли статически связанные библиотеки быть сделаны из объектных файлов, и наоборот, могут ли объектные файлы быть сделаны из статически связанных библиотек?

7

Решение

Объектные файлы скомпилированы, но несвязанный код. Библиотеки содержат объектные файлы. Таким образом, ваш вопрос звучит так: «Зачем использовать статически связанные библиотеки, если я могу просто использовать объектные файлы?» Вот почему

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

Бег ranlib в оболочке показано в первой строке текста справки:

Создайте индекс для ускорения доступа к архивам.

И из общего ранлиб документы:

Архив с таким индексом ускоряет связь с библиотекой и
позволяет подпрограммам в библиотеке вызывать друг друга независимо от
их размещение в архиве. T

Смотрите также FreeBSD ранлиб документы — другая формулировка, та же идея: скорость сцепления.

10

Другие решения

Библиотека — это просто файл, содержащий множество объектных файлов, в которых можно искать символы.

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

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

Это просто способ эффективной упаковки множества объектов в один файл, чтобы компоновщик мог выполнять больше работы — вам не нужно беспокоиться о который предметы, которые вам нужны.

Если вы думаете о библиотеке C, вы можете иметь printf.o, puts.o, fopen.o в результате держать ваш источник хорошо разделенным. Вы не хотите, чтобы пользователю приходилось явно перечислять каждый отдельный объектный файл, который он хочет, поэтому вы упаковываете весь лот в libc.a и скажите им, что им просто нужно связать этот файл.


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

6

По вопросам рекламы [email protected]