是否可以将静态库链接到Visual Studio中的动态库?

时间:2012-03-24 16:26:18

标签: c++ visual-studio static-libraries

我尝试在Visual Studio 2010 express中的动态库tmxParser.lib中链接静态库。我将静态库设置为动态库的依赖项。当VS构建静态库时,构建正常并创建tmxParser.lib。当VS构建动态库时,我收到链接器错误。我试图匹配属性页面下的运行时库 - >配置属性 - > C / C ++ - >代码生成 它没有任何帮助。任何人都有任何想法?

2>LIBCMTD.lib(fopen.obj) : error LNK2005: _fopen already defined in s3e_d.lib(iwcrt_stdio.obj)
2>LIBCMTD.lib(open.obj) : error LNK2005: __open already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(open.obj) : error LNK2005: __sopen already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(chsize.obj) : error LNK2005: __chsize already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(read.obj) : error LNK2005: __read already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(close.obj) : error LNK2005: __close already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(lseek.obj) : error LNK2005: __lseek already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(setmode.obj) : error LNK2005: __setmode already defined in s3e_d.lib(iwcrt_win32.obj)

2 个答案:

答案 0 :(得分:0)

当你说你将它设置为依赖项时,你的意思是你将它设置为项目依赖项或者在中的“附加依赖项”下吗?

Project Properties -> Librarian->General -> Additional Dependencies

答案 1 :(得分:0)

一般来说,是的。

你遇到的问题似乎是库(它是marmalade library?)实现了C ++运行时库中的一些方法。可能这个lib应该在没有链接标准运行时库的情况下使用。

可能的解决方案:

  • 不要在DLL中链接c ++运行时。如果你只写一个薄的包装器,这应该是可能的
  • 询问那些制作lib的人如何认为这应该起作用
  • 使用lib.exe或dumpbin.exe:
    • 提取lib
    • 的所有.obj文件
    • 从.obj文件中删除冲突的符号
    • 重新创建lib

后者显然是一个丑陋的黑客,应该保留给那些既没有源也没有原始开发者的情况。