QBziZ' answer is right enough. See http://stackoverflow.com/questions/236035/unmanaged-dlls-in-c#236052
To complete it: In C++, if you need to use a symbol, you must tell the compiler it exists, and often, its prototype.
In other languages, the compiler will just explore the library on its own, and find the symbol, et voilà.
In C++, you must tell the compiler.
See a C/C++ header as a book table of contents
The best way is to put in some common place the needed code. The "interface", if you want. This is usually done in an header file, called header because this is usually not an independent source file. The header is only a file whose aim is to be included (i.e. copy/pasted by the preprocessor) into true source files.
In substance, it seems you have to declare twice a symbol (function, class, whatever). Which is almost an heresy when compared to other languages.
You should see it as a book, with a summary table, or an index. In the table, you have all the chapters. In the text, you have the chapters and their content.
And sometimes, you're just happy you have the chapter list.
In C++, this is the header.
What about the DLL?
So, back to the DLL problem: The aim of a DLL is to export symbols that your code will use.
So, in a C++ way, you must both export the code at compilation (i.e., in Windows, use the __declspec, for example) and "publish" a table of what is exported (i.e. have "public" headers containing the exported declarations).