#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
我应该在哪里定义COMPILING_DLL
?
在这里看到:what does __declspec(dllimport) really mean?
听起来如果我不能使用相同的头文件,那么我根本无法使用加载时动态链接?
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
我应该在哪里定义COMPILING_DLL
?
在这里看到:what does __declspec(dllimport) really mean?
听起来如果我不能使用相同的头文件,那么我根本无法使用加载时动态链接?
另一个选择:
使用默认定义的宏 local 来处理项目。
您可以在以下位置查看项目中默认定义的宏 local:
属性 -> C/C++ -> 预处理器 -> 预处理器定义。
示例:
假设您的项目名称为:MyDLL
该项目默认的宏 local 为: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
定义COMPILING_DLL=1
的最佳位置是编译器的命令行。如果您使用Visual Studio IDE,则在项目属性中,选择 C/C++ ... 预处理器 ... 预处理器定义。
__declspec(dllimport)
是微软对C ++的特定扩展。微软有出色的在线文档。
#define
(可以在头文件或项目属性中)来定义COMPILING_DLL
。由于其他项目中不会设置这个宏(特别是如果您将其命名为比COMPILING_DLL
更好的名称),因此#if
指令将正常工作。请注意保留HTML标签。在理想情况下,您(实际上是 Visual Studio)在构建 DLL 时将 COMPILING_DLL
定义为编译器的参数。因此,默认情况下会使用 __declspec(dllexport)
。另一方面,在使用 DLL 的头文件时,您不需要定义这个参数,因此 DLLEXPORT
将默认评估为 __declspec(dllimport)
。
COMPILING_DLL
一样使用宏<projectname>_EXPORTS
,其中projectname
是通过 CMake 命令 project(projectname)
定义的:
在检测到共享库编译时,将定义预处理器宏
<target_name>_EXPORTS
。
我测试过,使用 Visual Studio 2015 Express 的 MSVC 编译器和 Ninja 生成器在 Windows 上可以工作。
#ifdef
而不是#if
来测试变量是否真正定义(我们不关心定义值或是否存在)。defined
或!defined
,你就可以使用#if
,例如#if defined SOMETHING || !defined SOMETHING_ELSE
。 - kayleeFrye_onDeck您不能在头文件中以这种方式定义函数体。这是被__declspec(dllimport)禁止的。此限定符只能在函数声明上指定,而不能在定义上指定。
您必须将函数体移动到源文件中。
在头文件中:
extern DLLEXPORT void test2();
void test2()
{
// ...
}
正如其他人所说,不要忘记将COMPILING_DLL添加到项目的预处理器定义中。
#define COMPILING_DLL
来解决它,而不是将其添加到:项目>属性>C / C ++>预处理器>预处理器定义中。 - Masood Khaari