dllexport / dllimport开关的宏

时间:2013-02-20 13:09:26

标签: c++ visual-studio-2010 visual-c++

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

我如何/在哪里定义COMPILING_DLL

见到这里: what does __declspec(dllimport) really mean?

如果我不能使用相同的标题,我完全不能使用加载时动态链接?

enter image description here

7 个答案:

答案 0 :(得分:10)

定义COMPILING_DLL=1的最佳位置是编译器的命令行。如果您使用Visual Studio IDE,则它位于项目属性... C / C ++ ...预处理器...预处理器定义。

__declspec(dllimport)是Microsoft特定的C ++扩展。 Microsoft拥有出色的在线文档。

答案 1 :(得分:8)

另一个选择:

默认定义的宏本地用于项目。

您可以在以下位置查看项目本地的默认定义宏:

属性 - > C / C ++ - >预处理器 - >预处理器定义。

示例:

假设您的项目名称为: MyDLL

该项目的默认宏本地: 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

答案 2 :(得分:2)

在DLL项目中,为#define添加COMPILING_DLL(在头文件或项目属性中)。因为这不会为任何其他项目设置(特别是如果你将它命名为比COMPILING_DLL更好的东西),那么#if指令将正常工作。

答案 3 :(得分:2)

您(实际上是理想情况下的Visual Studio)在构建DLL时将COMPILING_DLL定义为编译器的参数。因此,它将默认为__declspec(dllexport)。另一方面,当您使用DLL的头文件时,您没有定义它,因此默认情况下DLLEXPORT将被评估为__declspec(dllimport)

答案 4 :(得分:1)

您无法在头文件中以这种方式定义函数体。它是prohibited by __declspec(dllimport)。该说明符只能在函数声明中指定,而不能在定义中指定。

您必须将函数体移动到源文件。

头文件中的

extern DLLEXPORT void test2();

在.cpp文件中:

void test2()
{
   // ...
}

正如大家所说,不要忘记将COMPILING_DLL添加到项目预处理器定义中。

答案 5 :(得分:1)

实际上,真正的问题是预处理器指令。 您应该使用#ifdef而不是#if来测试变量是否真正定义(并且我们不关心定义的值或是否有任何变量)。

注意:我知道这个帖子已有1年历史,但对于将来遇到此问题的人来说,它仍然有用。

答案 6 :(得分:0)

如果使用CMake生成构建配置,则应该能够使用 宏<projectname>_EXPORTS的使用方式COMPILING_DLL,其中projectname是通过CMake命令project(projectname)定义的:

  

检测到共享库编译时,将定义预处理器宏<target_name>_EXPORTS

source

我进行了测试,它可以在Windows上使用带有Visual Studio 2015 Express编译器MSVC的Ninja生成器。

相关:CMake adds -Dlibname_EXPORTS compile definition