使用 dllimport 代替 dllexport
Using dllimport in place of dllexport
在 Visual Studio 2015 年构建我的 dll 时,我似乎可以互换使用 __declspec(dllexport)
和 __declspec(dllimport)
。我本以为在制作 DLL 时 dllexport
命令是必需的,但似乎 dllexport
或 dllimport
是 adequate.I 具有以下声明简单 add() 函数的头文件:
add.h
#pragma once
#ifdef ADDDLL_EXPORTS
#define ADDDLL_API __declspec(dllexport)
#else
#define ADDDLL_API __declspec(dllimport)
#endif
ADDDLL_API int add(int x, int y);
在 cpp 文件中使用以下定义:
add.cpp
#include "add.h"
int add(int x, int y)
{
return x + y;
}
我似乎能够使用构建的 DLL,无论 ADDDLL_EXPORTS
是否在配置属性 > 预处理器 > 预处理器定义中定义。例如,在一个包含 .lib 文件作为附加依赖项的单独项目中(配置属性 > 链接器 > 输入 > 附加依赖项),我有以下代码运行
main.cpp
#include <iostream>
#include "add.h"
int main()
{
int sum = add(4, 5);
std::cout << "sum = " << sum << std::endl;
std::system("pause");
return 0;
}
任何见解表示赞赏。让我知道是否需要更多信息。提前致谢!
如果你仔细看,你会看到你的 DLL 项目编译时带有 warnings,像这样:
c:\yourproject\add.cpp(3,1):warning C4273: 'add': inconsistent dll linkage
编译器知道你不怀好意。 dllimport
函数不应该被定义,只能被声明。因此,当编译器看到定义时,它假定应该使用 dllexport
,因为这是最合理的错误解决方案。
是个好习惯。
在 Visual Studio 2015 年构建我的 dll 时,我似乎可以互换使用 __declspec(dllexport)
和 __declspec(dllimport)
。我本以为在制作 DLL 时 dllexport
命令是必需的,但似乎 dllexport
或 dllimport
是 adequate.I 具有以下声明简单 add() 函数的头文件:
add.h
#pragma once
#ifdef ADDDLL_EXPORTS
#define ADDDLL_API __declspec(dllexport)
#else
#define ADDDLL_API __declspec(dllimport)
#endif
ADDDLL_API int add(int x, int y);
在 cpp 文件中使用以下定义:
add.cpp
#include "add.h"
int add(int x, int y)
{
return x + y;
}
我似乎能够使用构建的 DLL,无论 ADDDLL_EXPORTS
是否在配置属性 > 预处理器 > 预处理器定义中定义。例如,在一个包含 .lib 文件作为附加依赖项的单独项目中(配置属性 > 链接器 > 输入 > 附加依赖项),我有以下代码运行
main.cpp
#include <iostream>
#include "add.h"
int main()
{
int sum = add(4, 5);
std::cout << "sum = " << sum << std::endl;
std::system("pause");
return 0;
}
任何见解表示赞赏。让我知道是否需要更多信息。提前致谢!
如果你仔细看,你会看到你的 DLL 项目编译时带有 warnings,像这样:
c:\yourproject\add.cpp(3,1):warning C4273: 'add': inconsistent dll linkage
编译器知道你不怀好意。 dllimport
函数不应该被定义,只能被声明。因此,当编译器看到定义时,它假定应该使用 dllexport
,因为这是最合理的错误解决方案。