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