Macro for dllexport/dllimport switch

2019-01-08 01:16发布

#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?

enter image description here

6条回答
别忘想泡老子
2楼-- · 2019-01-08 01:19

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.

查看更多
▲ chillily
3楼-- · 2019-01-08 01:24

In the DLL project, you add a #define (either in a header file or in the project properties) for COMPILING_DLL. As this will not be set for any other project (especially if you name it something better than COMPILING_DLL) then the #if directive will work properly.

查看更多
太酷不给撩
4楼-- · 2019-01-08 01:27

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.

查看更多
Rolldiameter
5楼-- · 2019-01-08 01:35

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

 #ifdef  MYDLL_EXPORTS 
    /*Enabled as "export" while compiling the dll project*/
    #define DLLEXPORT __declspec(dllexport)  
 #else
    /*Enabled as "import" in the Client side for using already created dll file*/
    #define DLLEXPORT __declspec(dllimport)  
 #endif
查看更多
淡お忘
6楼-- · 2019-01-08 01:39

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:

extern DLLEXPORT void test2();

In .cpp file:

void test2()
{
   // ...
}

As folks said, don't forget to add COMPILING_DLL to the project preprocessor definitions.

查看更多
Juvenile、少年°
7楼-- · 2019-01-08 01:42

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, so DLLEXPORT will be evaluated by default to __declspec(dllimport).

查看更多
登录 后发表回答