__declspec(dllexport)和__declspec(dllimport)
2015-12-08 11:43
232 查看
1、解决的问题:
考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。二者使用同一个头文件,作为接口,怎么办呢?
2、解决办法:
使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值。
__declspec(dllexport)声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。
__declspec(dllimport)声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport)
才能导入 DLL 中使用的变量。
考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。二者使用同一个头文件,作为接口,怎么办呢?
2、解决办法:
使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值。
#ifndef DLL_H_ #define DLL_H_ #ifdef DLLProvider #define DLL_EXPORT_IMPORT __declspec(dllexport) #else #define DLL_EXPORT_IMPORT __declspec(dllimport) #endif DLL_EXPORT_IMPORT int add(int ,int); #endif
__declspec(dllexport)声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。
__declspec(dllimport)声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport)
才能导入 DLL 中使用的变量。
相关文章推荐
- hadoop2 详细讲解伪分布式安装步骤
- maven项目启动报java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
- ios中的三种弹框
- TextView里限制输入字数的方法
- 彩票生成器--36选7 无重复(案例)
- 数组去重
- Android 更新UI的两种方法——handler和runOnUiThread()
- javascript 导出div为图片PNG,div转svg,svg转canvas
- 最详细的Log4j使用教程
- 【转】KMP算法
- nodejs+express使用html和jade
- cocos2dx - 环境配置,项目创建
- iOS视频流开发(2)—视频播放
- 树状数组
- C#与PHP接口交互,通过Post方式
- MySQL中的datetime与timestamp比较
- 有感
- Linux多线程消费者和生产者模型实例(互斥锁和条件变量使用)
- 黑马程序员——Java重点基础之多线程(一)
- 面向对象---代码练习(以车为案例)