苏州西环路周围旅馆:warning LNK4070解决办法

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 13:29:25
warning LNK4070的解决办法http://blog.csdn.net/clever101/archive/2010/09/20/5898073.aspx 作者:朱金灿
来源:http://blog.csdn.net/clever101  
       重命名了一个MFC常规DLL的工程文件(VS C++ 2005编译环境),结果在编译时出现这样的警告:1>B.exp : warning LNK4070: .EXP 中的 /OUT:A.dll 指令与输出文件名"..\outdir\Debug\B.dll"不同;忽略指令(这里假设原来的工程文件名叫A.vcproj,改名后叫B.vcproj)。后来我发现虽然输出为B.dll,但是对应的静态库B.lib被其它工程以隐式链接的方式调用时,使用的还是A.dll(这个可以使用Dependcies工具来查看),这样导致往往其它动态库不能加载成功(因为)。这下我不能把它仅仅当做warning而弃之不管了,于是上网查资料解决这个warning。查完资料,再结合自己的思考,大致明白了造成warning的原因。原来是虽然我修改了工程名,但是没有修改这个工程的def文件中LIBRARY字段的值,造成工程的输出文件和def文件的LIBRARY字段的值不一样。比如我把A.vcproj修改为B.vcproj,但在def文件还是LIBRARY "A"。这时只需将def文件中的LIBRARY字段修改为:LIBRARY "B"。这样就能完全消除这个警告。而被别的库以隐式链接调用也是以B.dll面目出现的。 
链接警告:warning LNK4070: /OUT:dll.dll directive in .EXPhttp://hi.baidu.com/yueraiyuer/blog/item/c8a8843d5e8076e83d6d9715.html 

在生成dll时候经常出现lnk4070警告,尽管可能不会影响使用,但是也造成了一些麻烦诸如明明debug和release版本的lib名字不一样,可是exe却总是去找release版本的(debug的为结尾加了d的)。其实一直不晓得这个是怎么回事,也懒得去弄清楚了,反正能用就行了。今天看到一篇文章,恍然大悟!原来问题在这里,就是这个小小的warning造成了这一切。

先转帖如下: 引自地址http://hi.baidu.com/sonmeika/blog/item/726d47d0ccc5578ca1ec9c70.html

我在DLL项目中遇到了,因为要对Debug版和Release版分别指定不同的输出文件名。对Debug版,我指定输出文件为dllD.dll,对Release版指定为dllR.dll。

解决方法有两个:

(1)删掉自动生成的dll.DEF文件,在代码中使用_declspec(dllexport)导出函数;

(2)删掉dll.DEF文件中LIBRARY字段后面双引号及其内部的库名即可,也可以将其改掉。如改为:******************************************************************************************  

dll.def : Declares the module parameters for the DLL.  

LIBRARY      "dllD"
DESCRIPTION 'dll Windows Dynamic Link Library'              

EXPORTS    ; Explicit exports can go here
******************************************************************************************
还有更好方法:
1.生成两份DEF文件,
           xx.def //Release版本
           xxD.def //Debug版本
2.把这两个文件都添加到项目中
3.只要在Debug项目的Setting中选中xx.def,在右边的General中在Exclude file from built前打勾
同样在Release项目的Setting中选中xxD.def,在右边的General中在Exclude file from built前打勾
4.接下来就Betch Build吧


(#)