Я понимаю, что код, включенный в исполняемый файл во время компиляции, может поступать из объектных файлов (файлы .o) и статически связанных библиотек (файлы .lib / .a). В чем принципиальная и концептуальная разница между этими двумя? Почему существует различие между «объектным кодом» и «статически связанной библиотекой»? Каковы преимущества и недостатки каждого и почему использовать одно в отличие от другого? Могут ли статически связанные библиотеки быть сделаны из объектных файлов, и наоборот, могут ли объектные файлы быть сделаны из статически связанных библиотек?
Объектные файлы скомпилированы, но несвязанный код. Библиотеки содержат объектные файлы. Таким образом, ваш вопрос звучит так: «Зачем использовать статически связанные библиотеки, если я могу просто использовать объектные файлы?» Вот почему
В отличие от коллекции объектов, каждый из которых имеет свои собственные таблицы символов, библиотека имеет единый, унифицированный таблица символов, созданная при ar
вызывается разработчиком библиотеки с помощью s
переключатель. s
звонки ranlib
создать единую таблицу символов для всех объектов в этом архиве.
Бег ranlib
в оболочке показано в первой строке текста справки:
Создайте индекс для ускорения доступа к архивам.
И из общего ранлиб документы:
Архив с таким индексом ускоряет связь с библиотекой и
позволяет подпрограммам в библиотеке вызывать друг друга независимо от
их размещение в архиве. T
Смотрите также FreeBSD ранлиб документы — другая формулировка, та же идея: скорость сцепления.
Библиотека — это просто файл, содержащий множество объектных файлов, в которых можно искать символы.
Поэтому обычно, когда вы связываете объекты вместе, вы получаете все объекты в одном исполняемом файле (хотя некоторые оптимизирующие компоновщики могут выбрасывать неиспользуемые).
Когда вы передаете библиотеку компоновщику, он проверяет каждый из объектных файлов в нем и вводит те файлы, которые необходимы для удовлетворения неразрешенных символов (и, вероятно, будет продолжать вводить их до тех пор, пока все символы не будут разрешены или их больше не будет) ,
Это просто способ эффективной упаковки множества объектов в один файл, чтобы компоновщик мог выполнять больше работы — вам не нужно беспокоиться о который предметы, которые вам нужны.
Если вы думаете о библиотеке C, вы можете иметь printf.o
, puts.o
, fopen.o
в результате держать ваш источник хорошо разделенным. Вы не хотите, чтобы пользователю приходилось явно перечислять каждый отдельный объектный файл, который он хочет, поэтому вы упаковываете весь лот в libc.a
и скажите им, что им просто нужно связать этот файл.
Статически связанный бит здесь не имеет значения, он просто решает, что объекты должны входить в исполняемый файл во время соединения, а не динамически загружаться во время выполнения. Это объяснили Вот.