Dll的导入导出(export与import)
2013-08-20 09:37
465 查看
参考:http://blog.csdn.net/ooyyee11/article/details/6894436
一个lib提供了许多的资源,像类、函数、结构定义等:
我们在开发环境中搜索 *.lib,会发现很多lib库,像 Winmm.lib
当我们使用timeGetTime() 时,
1. 需要在 链接器--〉输入 中添加 Winmm.lib,
2. 同时,需要包括头文件:mmsystem.h
基于上面这个,我们查看timeGetTime在头文件中定义:
WINMMAPI DWORD WINAPI timeGetTime(void);
把宏翻译之后是:
__declspec(dllimport) DWORD __stdcall timeGetTime(void);
这个就是我们常见的引入的定义了
1. 一般我们定义导出函数或类的时候,都会使用类似的一组宏:
#ifdef _BASEFUNC_EXPORT_
#define BASE_API __declspec(dllexport)
#else
#define BASE_API __declspec(dllimport)
#endif
2. 在头文件中是用:
class BASE_API CJCJMsgCmd_PrintRoadMap : public CJCJMsgCmd
{
...
}
3. 在dll编译时,添加预编译选项 _BASEFUNC_EXPORT_,这样 BASE_API 相当于__declspec(dllexport)
4. 在使用dll的工程中,BASE_API 相当于__declspec(dllimport)
下面为转载的一篇内容,里面详细解释了与def文件的关系:(.def文件较适用非MFC程序调用DLL)
http://blog.chinaunix.net/uid-23929779-id-3936638.html
在C++中自建的dll定义的API,是不是应该在.def中做一个声明。 MSDN中的名词解释模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将__declspec(dllexport) 用作指定导出函数的手段。在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用
.def 文件。如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
通俗解释: 在VC++中,生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加 __declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果 DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如 VB、delphi,以及.NET 用户使用的,那么会产生一个小麻烦。因为VC++对于 __declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall IsWinNT() 会转换为IsWinNT@0,这样你在VB中必须这样声明: Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。 EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、 Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。例子:我们用VC6.0制作一个dll,不使用.def文件,在头文件中这样写
#ifndef LIB_H #define LIB_H extern "C" int _declspec(dllexport)add(int x,int y); #endif
如果是.def文件,可以这样 LIBRARY "xxx_dll" EXPORTS add PRIVAT
一个lib提供了许多的资源,像类、函数、结构定义等:
我们在开发环境中搜索 *.lib,会发现很多lib库,像 Winmm.lib
当我们使用timeGetTime() 时,
1. 需要在 链接器--〉输入 中添加 Winmm.lib,
2. 同时,需要包括头文件:mmsystem.h
基于上面这个,我们查看timeGetTime在头文件中定义:
WINMMAPI DWORD WINAPI timeGetTime(void);
把宏翻译之后是:
__declspec(dllimport) DWORD __stdcall timeGetTime(void);
这个就是我们常见的引入的定义了
1. 一般我们定义导出函数或类的时候,都会使用类似的一组宏:
#ifdef _BASEFUNC_EXPORT_
#define BASE_API __declspec(dllexport)
#else
#define BASE_API __declspec(dllimport)
#endif
2. 在头文件中是用:
class BASE_API CJCJMsgCmd_PrintRoadMap : public CJCJMsgCmd
{
...
}
3. 在dll编译时,添加预编译选项 _BASEFUNC_EXPORT_,这样 BASE_API 相当于__declspec(dllexport)
4. 在使用dll的工程中,BASE_API 相当于__declspec(dllimport)
下面为转载的一篇内容,里面详细解释了与def文件的关系:(.def文件较适用非MFC程序调用DLL)
http://blog.chinaunix.net/uid-23929779-id-3936638.html
在C++中自建的dll定义的API,是不是应该在.def中做一个声明。 MSDN中的名词解释模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将__declspec(dllexport) 用作指定导出函数的手段。在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用
.def 文件。如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
通俗解释: 在VC++中,生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加 __declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果 DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如 VB、delphi,以及.NET 用户使用的,那么会产生一个小麻烦。因为VC++对于 __declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall IsWinNT() 会转换为IsWinNT@0,这样你在VB中必须这样声明: Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。 EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、 Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。例子:我们用VC6.0制作一个dll,不使用.def文件,在头文件中这样写
#ifndef LIB_H #define LIB_H extern "C" int _declspec(dllexport)add(int x,int y); #endif
如果是.def文件,可以这样 LIBRARY "xxx_dll" EXPORTS add PRIVAT
相关文章推荐
- 【Oracle】数据导入导出(expdp、impdp ;export、import)——用户模式
- Windows DLL编程中的导入导出:__declspec(dllimport) ,__declspec(dllexport)
- Magento的”导入/导出”(import/export)
- DB2数据的导入(Import) 导出(Export)(Load)
- Django import / export实现数据库导入导出
- DB2数据的导入(Import) 导出(Export)(Load)
- SAP HANA 导入导出(SAP HANA Export & Import)
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
- Hive-Import/Export(导入导出)
- VC6动态库导入导出和DEF文件编写(dll,export,def)
- dll导入、导出声明__declspec(dllexport) 和__declspec(dllimport)用法
- Oralce import,export 导入导出及备份
- 使用datapump 导出导入同义词(export and import synonym using datapump)
- MEF学习系列(3): 导入(Import)和导出(Export)之 元数据(Metadata)和自定义导出(Custom Export)
- Windows DLL编程中的导入导出:__declspec(dllimport) ,__declspec(dllexport) ,
- MEF 导入(Import)和导出(Export)
- [转] ES6 import/export:模块导入导出方式
- mongodb数据导入导出mongoexport/mongoimport
- SVN中检出(check out)、导出(export)、导入(import)、add(添加)、update(更新)的区别