В чем разница между файлом .o и файлом .lib? - PullRequest
10 голосов
/ 09 декабря 2010

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

Ответы [ 3 ]

12 голосов
/ 09 декабря 2010

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

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

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

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

9 голосов
/ 09 декабря 2010

Файл .LIB представляет собой коллекцию .OBJ. файлы объединены вместе с индекс. Там не должно быть никакой разницы в том, как обрабатывает линкер.

Цитируется здесь:

В чем разница между файлами .LIB и .OBJ? (Visual Studio C ++)

5 голосов
/ 09 декабря 2010

Они на самом деле сильно отличаются, особенно с более старыми компоновщиками.

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...