В чем разница между файлом .o и файлом .lib?

В чем разница между файлом .o и .lib файлом?

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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