Re: Problem with a DLL and a Static Library
On Mon, 12 Jun 2006 18:14:49 +0300, Mihai Popescu <m_pop_escu@yahoo.com>
wrote:
Well, I guess it's not defined when building the LIB so AGE_API would
become __declspec(dllimport). That's why I get that
"warning C4273: inconsistent dll linkage ".
I've also tried also to define AGE_API as an empty macro during LIB
linkage, puting the following directives into LIB-s header files.
#ifdef DLL
#ifdef AGE_EXPORTS
#define AGE_API __declspec(dllexport)
#else
#define AGE_API __declspec(dllimport)
#endif
#else
#define AGE_API
#endif
Then I define DLL macro in the DLL project and in the GUI (#define
DLL) before including header files (from the LIB directory).
But now, I get linker errors and new warnings:
"LNK2019: unresolved external symbol"
"warning C4005: 'AGE_API' : macro redefinition"
I guess I'll have to ignore previous warnings...even if I wonder why
this second method doesnt work.
Of course there is a logical reason...but I don't get-it... That's
why I'm asking for help... :D
If I understand your previous messages, you're trying to get a DLL to
export functions defined in a static library. The latter isn't part of the
former, so I don't think I'd approach it that way. Instead, I'd probably
have the DLL export some forwarding functions.
The static library should not be using the __declspec. The dllexport should
be in effect when compiling the DLL, while the dllimport should be in
effect when not compiling the DLL. I always do it like this:
In some DLL header file, which the other DLL headers #include, write the
following, replacing "X" with the name of your DLL, making sure it has a
reasonable chance of being unique:
#ifdef COMPILING_X_DLL
#define X_EXPORT __declspec(dllexport)
#else
#define X_EXPORT __declspec(dllimport)
#endif
Then #define COMPILING_X_DLL only in that DLL's project. This method can be
used by multiple DLLs, and since the macro names are unique, they don't
conflict. Then you can do things like:
X_EXPORT void f();
class X_EXPORT MyClass
{
...
};
Look in the project's preprocessor options, and you may find the AppWizard
has already defined a suitable COMPILING_X_DLL macro for you.
--
Doug Harrison
Visual C++ MVP