#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
How / where do I define COMPILING_DLL
?
Seen here: what does __declspec(dllimport) really mean?
Sounds like I can't use load-time dynamic linking at all if I can't use the same header?
Actually, the real problem is the preprocessor directive. You should use
#ifdef
and not#if
to test if the variable is really defined (and we don't care about the defined value or if there is any).NOTE: I know this thread is 1-year old but it still may be useful for somebody who have this problem in the future.
In the DLL project, you add a
#define
(either in a header file or in the project properties) forCOMPILING_DLL
. As this will not be set for any other project (especially if you name it something better thanCOMPILING_DLL
) then the#if
directive will work properly.Best place to define
COMPILING_DLL=1
is command line of compiler. If you use Visual Studio IDE then it is in Project properties ... C/C++ ... Preprocessor ... Preprocessor Definitions.__declspec(dllimport)
is Microsoft specific extension to C++. Microsoft has excellent online documentation.One another option:
Use the default defined macro local to the project.
You can see the default defined macros local to the project in the below location:
Properties -> C/C++ -> Preprocessor -> Preprocessor Definition.
Example:
Suppose your Project Name is: MyDLL
Default Macro Local to that project: MYDLL_EXPORTS
You can't define function body that way in the header file. It is prohibited by __declspec(dllimport). This specifier can only be specified on function declaration, not definition.
You have to move the function body to a source file.
in header file:
In .cpp file:
As folks said, don't forget to add COMPILING_DLL to the project preprocessor definitions.
You (actually Visual Studio in ideal cases) defines the
COMPILING_DLL
as an argument to the compiler when you build the DLL. So, it will default to__declspec(dllexport)
. On the other end, when you USE the DLL's header file, you don't define this, soDLLEXPORT
will be evaluated by default to__declspec(dllimport)
.