Well, during compilation on Windows, an executable will have the resolved external function address embedded into it. Basically, it's faster to hook up the function, but less flexible. A shared object is just an object, and the function is resolved at runtime, also allowing for free exchange of shared objects. Kind of like Java classes, except not.