warning LNK4017,DLL中.def文件的使用

VC6.0程序移到VS2010出现警告之warning LNK4017:

从VC6.0的程序中看到.def文件为


编译时总是出现警告

\EvaDataGr.def(5): warning LNK4017: DESCRIPTION 语句不支持目标平台;已忽略

    找了很久也没找到相应的解决办法,查到一篇博客中的.def文件定义后,暂用删除DESCRIPTION  'DataTypeWm Windows Dynamic Link Library'这句话的办法编译,路过的大神有更好的办法,请指教~


.def文件定义

DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

首先创建 一个DLL程序,.cpp中

[cpp]  view plain  copy
  1. int __stdcall Add(int numa, int numb)  
  2. {  
  3.        return (numa + numb);  
  4. }  
  5.   
  6. int __stdcall Sub(int numa, int numb)  
  7. {  
  8.         return (numa - numb);  
  9. }  
 

然后创建一个.def的文件,在里面加上

;DllTestDef.lib : 导出DLL函数
;作者:----
LIBRARY DllTestDef
EXPORTS 
Add @ 1
Sub @ 2

最后创建一个测试程序:.cpp文件如下:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <windows.h>  
  3.   
  4. using namespace std;  
  5.   
  6. typedef int (__stdcall *FUN)(intint);  
  7. HINSTANCE hInstance;  
  8. FUN   fun;  
  9.   
  10. int main()  
  11. {  
  12.        hInstance = LoadLibrary("DLLTestDef.dll");  
  13.        if(!hInstance)  
  14.            cout << "Not Find this Dll" << endl;  
  15.        fun = (FUN)GetProcAddress(hInstance, MAKEINTRESOURCE(1));  
  16.        if (!fun)  
  17.        {  
  18.               cout << "not find this fun" << endl;  
  19.        }  
  20.        cout << fun(1, 2) << endl;  
  21.        FreeLibrary(hInstance);  
  22.        return 0;  
  23. }  

说明:
.def文件的规则为:
     (1)LIBRARY语句说明.def文件相应的DLL;
  (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
  (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。

如果导出 C++ 文件中的函数,必须将修饰名放到 .def 文件中,或者通过使用外部“C”定义具有标准 C 链接的导出函数。如果需要将修饰名放到 .def 文件中,则可以通过使用 DUMPBIN 工具或 /MAP 链接器选项来获取修饰名。请注意,编译器产生的修饰名是编译器特定的。如果将 Visual C++ 编译器产生的修饰名放到 .def 文件中,则链接到 DLL 的应用程序必须也是用相同版本的 Visual C++ 生成的,这样调用应用程序中的修饰名才能与 DLL 的 .def 文件中的导出名相匹配。

如果生成扩展 DLL 并使用 .def 文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:


#undef AFX_DATA#define AFX_DATA AFX_EXT_DATA// <body of your header file>#undef AFX_DATA#define AFX_DATA这些代码行确保内部使用的 MFC 变量或添加到类的变量是从扩展 DLL 导出(或导入)的。例如,当使用 DECLARE_DYNAMIC 派生类时,该宏扩展以将 CRuntimeClass 成员变量添加到类。省去这四行代码可能会导致不能正确编译或链接 DLL,或在客户端应用程序链接到 DLL 时导致错误。

当生成 DLL 时,链接器使用 .def 文件创建导出 (.exp) 文件和导入库 (.lib) 文件。然后,链接器使用导出文件生成 DLL 文件。隐式链接到 DLL 的可执行文件在生成时链接到导入库。

请注意,MFC 本身使用 .def 文件从 MFCx0.dll 导出函数和类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值