__declspec(dllexport)和__declspec(dllimport)
来源:互联网 发布:企业邮箱软件下载 编辑:程序博客网 时间:2024/06/05 10:26
__declspec(dllexport)
__declspec(dllimport)
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的:
不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
初看起来,这段话前面的意思是,不用它也可以正常使用DLL的导出库,但最后一句话又说,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量这个是什么意思??
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
class DLL_EXPORT SimpleDLLClass
{
public:
SimpleDLLClass();
virtual ~SimpleDLLClass();
virtual getValue()
{
return m_nValue;
};
private:
int m_nValue;
};
SimpleDLLClass.cpp
2
3
4
5
6
7
8
SimpleDLLClass::SimpleDLLClass()
{
m_nValue = 0;
}
SimpleDLLClass::~SimpleDLLClass()
{
}
然后你再使用这个DLL类,在你的APP中include SimpleDLLClass.h时,你的APP的项目不用定义 SIMPLEDLL_EXPORT 所以,DLL_EXPORT 就不会存在了,这个时候,你在APP中,不会遇到问题。这正好对应MSDN上说的__declspec(dllimport)定义与否都可以正常使用。但我们也没有遇到变量不能正常使用呀。 那好,我们改一下SimpleDLLClass,把它的m_nValue改成static,然后在cpp文件中加一行
1 int SimpleDLLClass::m_nValue = 0;
2
3
4
5
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
再LINK,一切正常。原来dllimport是为了更好的处理类中的静态成员变量的,如果没有静态成员变量,那么这个__declspec(dllimport)无所谓。
- __declspec(dllexport) 和 __declspec(dllimport))
- __declspec(dllexport) 和 __declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllimport)和__declspec(dllexport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport) 和 __declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllimport) 和__declspec(dllexport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)和__declspec(dllimport)
- __declspec(dllexport)/__declspec(dllimport)
- php中namespace和use的用法
- 实现DUBBO服务环境隔离
- maven各种类的基本写法
- radiobutton加角标
- Android酷炫实用的开源框架(UI框架)
- __declspec(dllexport)和__declspec(dllimport)
- oracle启动与关闭
- js 设置和调用Cookie
- tensorflow示例代码注释2
- ScrollView嵌套ListView问题总结(一)
- thinkphp not found 不能使用urlrewrite
- 怎么在Beyond Compare文本比较时设置书签
- Android studio实现get和set的快捷键
- ubuntu笔记