В чем разница между файлом .o и .lib файлом?
В чем разница между файлом .o и файлом .lib?
Ответ 1
Файл .LIB представляет собой набор .OBJ файлы, объединенные вместе с индекс. Не должно быть разницы как работает линкер.
Цитата:
В чем разница между файлами .LIB и .OBJ? (Visual Studio С++)
Ответ 2
Концептуально, блок компиляции (единица кода в исходном файле/объектном файле) либо полностью связан, либо вообще отсутствует. Хотя некоторые реализации, со значительным уровнем сотрудничества между компилятором и компоновщиком, могут удалять неиспользуемый код из объектных файлов во время ссылки, это не изменяет проблему, которая включает в себя 2 единицы компиляции с конфликтующими именами символов в программе, является ошибкой.
В качестве практического примера предположим, что ваша библиотека имеет две функции foo
и bar
, и они находятся в объектном файле вместе. Если я хочу использовать bar
, но моя программа уже имеет внешний символ с именем foo
, я застрял с ошибкой. Даже если и как реализация может решить эту проблему для меня, код по-прежнему неверен.
С другой стороны, если у меня есть файл библиотеки, содержащий два отдельных файла объекта, один с foo
, а другой с bar
, в мою программу будет вложена только та, которая содержит bar
.
При написании библиотек вы должны избегать включения нескольких функций в один и тот же объектный файл, если только они не используются вместе. Это приведет к раздуванию приложений, которые связывают вашу библиотеку (статически) и увеличивают вероятность конфликтов символов. Лично я предпочитаю заблуждаться на стороне отдельных файлов, если есть сомнения - даже полезно помещать foo_create
и foo_free
в отдельные файлы, если последнее нетривиально, так что короткие одноразовые программы, которые не нужно вызывать foo_free
может избежать потянуть код для глубокого освобождения (и, возможно, даже не потянуть за реализацию самого free
).
Ответ 3
Они на самом деле совершенно разные, особенно со старыми линкерами.
Файлы .o(или .obj) являются объектными файлами, они содержат выходные данные генерируемого компилятором кода. Он все еще находится в промежуточном формате, например, большинство ссылок все еще не разрешено. Обычно между исходным файлом и объектным файлом происходит сопоставление "один к одному".
Файлы .a(или .lib) являются архивами, также известными как библиотека, и представляют собой набор объектных файлов.
Во всех операционных системах есть инструменты, которые позволяют добавлять/удалять/перечислять файлы объектов в файлы библиотеки.
Еще одно отличие, особенно со старыми линкерами, заключается в том, как обрабатываются файлы при их связывании. Некоторые связанные будут помещать полный объектный файл в окончательный двоичный файл, независимо от того, что на самом деле используется, в то время как они будут извлекать полезную информацию из файлов библиотеки.
В настоящее время большинство компоновщиков достаточно умны, чтобы удалить все, что не используется.