参考: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
通俗解释: 在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