2010-12-09 3 views

ответ

5

Они на самом деле очень разные, особенно со старыми линкерами.

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

Файлы .a (или .lib) являются архивами, также известными как библиотека, и представляют собой набор объектных файлов.

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

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

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

+1

Последнее предложение во многом ложно. – 2010-12-09 14:41:40

9

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

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

С другой стороны, если у меня есть файл библиотеки, содержащий два отдельных объектных файлов, один с foo и другие с bar, только один, содержащий bar будут втянуты в мою программу.

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

Смежные вопросы