views:

95

answers:

4

I have a framework (in C++) which is dependent on a few third party libraries. When I compile a static version of the library framework, no additional dependencies are needed, that is, the lib files of the third part libraries are not needed. When I compile the same framework as a DLL, additional dependencies are now needed otherwise I get linking errors. I can guess as to why this is happening but would like a concrete answer/explanation to understand what is happening.

EDIT: Just to clarify, I am developing a framework which can be compiled as a lib and as a dll and then used in a(n) (executable) project. When compiling the framework as a lib and using functions from a third party library, I don't need additional dependencies. However, a project that now uses the lib file (which is the framework) must include the 3rd party lib files. When I compile the framework as a dll it gives me linking errors unless I specify the 3rd part libraries the framework is technically dependent on. For example: I have a few classes that call functionality from within Ogre3D. These classes are compiled as a lib file. I don't need to link against OgreMain.lib when compiling a lib of the classes. On the other hand, when I am compiling a dll version of the same classes, I now need to link against OgreMain.lib

+2  A: 

When you have a static library (a .lib file), which is just a collection of one or more object files (.obj), the linker just adds that code to yours in one executable. You can tell the linker to do this via a command line switch, an IDE configuration setting, or perhaps even a #pragma (specifics depend on your environment and compiler).

When you link in a DLL, you need to give the linker some code to call when you invoke one of the DLLs functions. Usually, this is done with a file of the same name as the .dll, save that it is a .lib. The code in that .lib is linked into your program the same way as described above, but when you call it, it loads the DLL (if not already loaded) and then invokes the proper function.

There are other ways to handle DLL linking (for instance, .def files or #using statements in .NET), but this seems to be what you're talking about.


Responding to your question clarification:

The issue is that a .lib is not a final product. It is just an aggregation of object code to be used later when a linker connects all your functions calls to function addresses.

A DLL, on the other hand, is a final product, and so the linker requires all functions and variables be connected to actual addresses.

I'm speaking a bit imprecisely, but you get the idea.

mlimber
This isn't entirely accurate. The DLL/Lib style linkage is faster than .def files and GetProcAddress. I upvoted you anyway, but just to be pedantic, they are definitely not the same. For example, you can link member functions and a lot more using __declspec in comparison to .def files.
DeadMG
Thank you for the explanation. That clears up the concept of Lib and DLL linking in an executable project. In the case of a framework that will be compiled as a `lib` file or a `dll` I still don't fully understand why I don't need any 3rd part `lib` in "additional dependencies" for the `lib` of my framework to compile whereas, I need all the 3rd party `lib` files in "additional dependencies" for the `dll` version of the same framework to compile.
Samaursa
Updated per your question clarification.
mlimber
Thanks for the clarification, that hit the mark!
Samaursa
A: 

A static library can include other static libraries, providing a single lib to link

A DLL can include static libraries, providing a single DLL to link.

A DLL or static library with dependencies on other DLLs has no way to combine them so your executable must explicitly link to those other DLLs.

Andy Dent
A: 

When you link to a LIB it adds all the symbols/functions you actually use to your executable. The ones you don't use won't get added. When you link to a dll - all the code from the external library gets loaded. If this additional code (code you don't use) depends on more external libraries you need to provide these as well.

One example: You want to use a ip class from a network library. The ip class does not depend on other libraries. Other functions in the network library depend on other external libraries. If you link the network library as a LIB you just link the ip class -> you don't need the other libraries since the other code wont get linked. When you use the DLL all code in the dll need to be instanciated -> so you will need to provide the other external libraries.

David Feurle
A: 

Building a DLL is more like building an application than a library. The difference between building an application and a DLL is knowledge of what might be called. In an application all symbols that are not used can be discarded in the build, but in a DLL you cannot strip symbols that are not used - that would be all of them... You would find the same link problems in your static libraries if you where able to call all the symbols that the DLL links.

Jesper Madsen