静态库工程中链接静态库或动态库的warning LNK4006 4221

willhave 2010-01-07 11:57:44
我在Win32静态库工程中需要用到其他静态库和动态库中的函数,我直接在静态库工程中链接的话,会出现一堆链接警告,不过暂时使用正常,具体如下:

1>libeay32.lib(fips_err.obj) : warning LNK4221: no public symbols found; archive member will be inaccessible
1>XMLUtility.lib(XMLUtility.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in rpcrt4.lib(RPCRT4.dll); second definition ignored
1>XMLUtility.lib(XMLUtility.dll) : warning LNK4221: no public symbols found; archive member will be inaccessible

1>Local.obj : warning LNK4006: "public: virtual __thiscall TiXmlDocument::~TiXmlDocument(void)" (??1TiXmlDocument@@UAE@XZ) already defined in XMLUtility.lib(XMLUtility.dll); second definition ignored
1>Local.obj : warning LNK4006: "public: virtual class TiXmlElement const * __thiscall TiXmlNode::ToElement(void)const " (?ToElement@TiXmlNode@@UBEPBVTiXmlElement@@XZ) already defined in XMLUtility.lib(XMLUtility.dll); second definition ignored
1>Local.obj : warning LNK4006: "public: virtual class TiXmlComment const * __thiscall TiXmlNode::ToComment(void)const " (?ToComment@TiXmlNode@@UBEPBVTiXmlComment@@XZ) already defined in XMLUtility.lib(XMLUtility.dll); second definition ignored
…………
注:libeay32.lib是静态库,XMLUtility.lib是动态库。


当然,我如果不在静态库工程中链接,而在使用这个静态库的工程中链接这些就没问题。不过我想最后发布的只用一个静态库+几个Dll(尽快简单),而不是给别人一堆的.lib文件

所以想弄明白那些警告是怎么回事,怎么解决?



...全文
877 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
foryu666 2010-09-16
  • 打赏
  • 举报
回复
我觉得楼上的楼上说的是动态库与静态库的分别。
至于您说的分别,#pragma comment是预处理命令,会告诉编译器编译该文件是需要寻找那些库。
直接在工程设置加的话,会直接在编译命令处添加该库。
willhave 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 miaolingshaohua 的回复:]
引用 5 楼 willhave 的回复:
现在问题已经解决了,不用在工程属性中链接,而用
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"XMLUtility.lib")

不过转问个问题吧:这两种链接动态库或静态库的方式有什么区别?

动态链接就是在程序需要的时候再链接进去,静态就是在初始化得时候就链接进去
[/Quote]

不好意思,好像我没表达清楚
我是想问在工程设置里加入库,和用语句#pragma comment(lib,"libeay32.lib")加入库有什么不同?

楼上的意思是#pragma comment(lib,"XMLUtility.lib") 是动态链接,在工程设置里就是静态链接吗?
还是误解了我的意思?
哈利路亚1874 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 willhave 的回复:]
现在问题已经解决了,不用在工程属性中链接,而用
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"XMLUtility.lib")

不过转问个问题吧:这两种链接动态库或静态库的方式有什么区别?
[/Quote]
动态链接就是在程序需要的时候再链接进去,静态就是在初始化得时候就链接进去
willhave 2010-01-08
  • 打赏
  • 举报
回复
现在问题已经解决了,不用在工程属性中链接,而用
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"XMLUtility.lib")

不过转问个问题吧:这两种链接动态库或静态库的方式有什么区别?
willhave 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arong1234 的回复:]
尽管如此,给lib+dll是比较推荐的方法,不知道你希望这种“简单”有什么好处,所谓的简单无非就是多拷贝一个文件和少拷贝一个文件的问题,也没简化多少
[/Quote]

我想只给一个MyApp.lib和XMLUtility.dll,别人用的时候只用链接MyApp.lib就行了,而不是给别人MyApp.lib、libeay32.lib、XMLUtility.lib、XMLUtility.dll,再让别人链接3个lib。

这还是小程序而已,如果用的其他库多了,岂不要连N多
arong1234 2010-01-08
  • 打赏
  • 举报
回复
尽管如此,给lib+dll是比较推荐的方法,不知道你希望这种“简单”有什么好处,所谓的简单无非就是多拷贝一个文件和少拷贝一个文件的问题,也没简化多少
arong1234 2010-01-08
  • 打赏
  • 举报
回复

Local.obj : warning LNK4006: "public: virtual class TiXmlComment const * __thiscall TiXmlNode::ToComment(void)const " (?ToComment@TiXmlNode@@UBEPBVTiXmlComment@@XZ) already defined in XMLUtility.lib(XMLUtility.dll); second definition ignored
arong1234 2010-01-08
  • 打赏
  • 举报
回复
我估计是你不同静态库都链接了一些东西,导致一些冲突,只是warning,就不要管了
如果你要研究,把诸如“LNK4221”之类的link 错误编号在MSDN中输入,它就会直接带你到解释的页面,慢慢研究即可

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧