开发者

What is the difference between a .o file and a .lib file?

开发者 https://www.devze.com 2023-01-29 22:52 出处:网络
What is the difference between a .o 开发者_如何学JAVAfile and a .lib file?Conceptually, a compilation unit (the unit of code in a source file/object file) is either linked entirely or not at all. Whil

What is the difference between a .o 开发者_如何学JAVAfile and a .lib file?


Conceptually, a compilation unit (the unit of code in a source file/object file) is either linked entirely or not at all. While some implementations, with significant levels of cooperation between the compiler and linker, are able to remove unused code from object files at link time, it doesn't change the issue that including 2 compilation units with conflicting symbol names in a program is an error.

As a practical example, suppose your library has two functions foo and bar and they're in an object file together. If I want to use bar, but my program already has an external symbol named foo, I'm stuck with an error. Even if or how the implementation might be able to resolve this problem for me, the code is still incorrect.

On the other hand, if I have a library file containing two separate object files, one with foo and the other with bar, only the one containing bar will get pulled into my program.

When writing libraries, you should avoid including multiple functions in the same object file unless it's essential that they be used together. Doing so will bloat up applications which link your library (statically) and increase the likelihood of symbol conflicts. Personally I prefer erring on the side of separate files when there's a doubt - it's even useful to put foo_create and foo_free in separate files if the latter is nontrivial so that short one-off programs that don't need to call foo_free can avoid pulling in the code for deep freeing (and possibly even avoid pulling in the implementation of free itself).


A .LIB file is a collection of .OBJ files concatenated together with an index. There should be no difference in how the linker treats either.

Quoted from here:

What is the difference between .LIB and .OBJ files? (Visual Studio C++)


They are actually quite different, specially with older linkers.

The .o (or .obj) files are object files, they contain the output of the compiler generated code. It is still in an intermediate format, for example, most references are still unresolved. Usually there is a one to one mapping between the source file and the object file.

The .a (or .lib) files are archives, also known as library, and are a set of object files.

All operating systems have tools that allow you to add/remove/list object files to library files.

Another difference, specially with older linkers is how the files are dealt with, when linking them. Some linked will place the complete object file into the final binary, regardless of what is actually being used, while they will only extract the useful information out of library files.

Nowadays most linkers are smart enough to remove all stuff that is not being used.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号