__declspec(dllexport) & __declspec(dllimport)
来源:互联网 发布:盐城大数据产业园详址 编辑:程序博客网 时间:2024/05/16 18:15
_declspec(dllexport)
- 声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中
- 省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类
__declspec(dllimport)
- 声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中
- 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
// File: SimpleDLLClass.h
#ifdef SIMPLEDLL_EXPORT
#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;
};
// File: SimpleDLLClass.cpp
#include "SimpleDLLClass.h"
SimpleDLLClass::SimpleDLLClass()
{
m_nValue=0;
}
SimpleDLLClass::~SimpleDLLClass()
{
}
说明:
1. 在你的APP中include SimpleDLLClass.h时,如果你的APP的项目不定义SIMPLEDLL_EXPORT,则DLL_EXPORT不存在。此时APP仍可以正常运行。
// File: SimpleDLLClass.h
static int m_nValue;
// File: SimpleDLLClass.cpp
int SimpleDLLClass::m_nValue=0;
说明:
1. 如果你的APP的项目不定义SIMPLEDLL_EXPORT,则DLL_EXPORT不存在。此时APP无法LINK。原因是找不到m_nValue。(原因:静态变量m_nValue已被DLL导出,但SimpleDLLClass无法访问m_nValue)
Workaround:
#define DLL_EXPORT __declspec(dllimport)
Conclusion:
dllimport是为了更好的处理类中的静态成员变量(或者其他...)的,如果没有静态成员变量(或者其他...),那么这个__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(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(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllimport)与__declspec(dllexport)
- 解决war包发布时报:java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor cannot b
- C语言: 几个测试题
- VS里各种链接相关问题和解决方法
- ora-01940处理(杀session解锁)
- mahout seq2sparse源文件解析
- __declspec(dllexport) & __declspec(dllimport)
- SQL Server 数据库迁移孤立用户的解决方法
- C++ - Adapter模式
- 使用路径变形编辑器制作坦克履带动画
- UTI 唯一类型标识
- ArcGIS Server Java ADF案例教程
- Flex的RSL部署
- java 中的大数据类型(BigInteger和BigDecimal)
- 不支持类型