链接期间模板实例冲突

时间:2013-10-14 09:07:24

标签: c++ templates visual-c++ linker

当我使用VC9 + Win SDK 7.0A构建库(不常见,因此我不会命名)时,我会收到如下错误。所有这些错误都与模板功能有关。是什么导致它以及如何处理它? - 在底部附加编译器命令和链接器命令。

我对此感到非常不安。是不是模板可以在许多库/目标文件中多次使用相同的参数进行实例化?

msvcprt.lib(MSVCP90.dll) : error LNK2005: 
"class std::basic_ostream<char,struct std::char_traits<char> > & 
__cdecl std::operator<<<struct std::char_traits<char> > (
class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" 
(??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z) 
already defined in CvBuildLists.obj

编译器

"(...)\Microsoft Visual Studio 9.0\VC\bin\cl.exe" /nologo /MD /Zi /O2 /Oy /Oi- 
/DNDEBUG /Fp"Release\CvGameCoreDLL.pch" /GR /Gy /W3 /EHsc /arch:SSE2 /Gd /Gm- 
/DWIN32 /D_WINDOWS /D_USRDLL /DCVGAMECOREDLL_EXPORTS /Yu"CvGameCoreDLL.h" /Zm200 
/Zc:wchar_t- /D_CRT_NON_CONFORMING_SWPRINTFS /D_CRT_SECURE_NO_WARNINGS 
(some library specific definitions) 
/I"(...)\Microsoft Visual Studio 9.0\VC/include" 
/I"(...)\Microsoft SDKs\Windows\v7.0A/Include" 
/I"(...)\Microsoft SDKs\Windows\v7.0A/Include/mfc" 
/I"(...)\Boost-1.32.0/include" /I"(...)\Python24/include" 
/I"(...)\xerces-c-3.1.1/src" 
/YcCvGameCoreDLL.h /Fo"Release\CvBuildLists.obj" 
/c CvBuildLists.cpp

链接器

"(...)\Microsoft Visual Studio 9.0\VC\bin\link.exe" 
/out:Release\CvGameCoreDLL.dll /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF 
/IMPLIB:"Release\CvGameCoreDLL.lib" /PDB:"Release\CvGameCoreDLL.pdb" /DLL 
/NOLOGO /SUBSYSTEM:WINDOWS /LARGEADDRESSAWARE /TLBID:1 /DEF:CvGameCoreDLL.def 
/NODEFAULTLIB:LIBCMT (-- not sure about this, but without it, the mentioned errors looks the same)
/LIBPATH:"(...)\Python24/libs" /LIBPATH:"(...)\Boost-1.32.0/libs/" 
boost_python-vc71-mt-1_32.lib thread.obj exceptions.obj condition.obj xtime.obj 
mutex.obj once.obj recursive_mutex.obj read_write_mutex.obj tss_hooks.obj 
/LIBPATH:"(...)\Microsoft Visual Studio 9.0\VC/lib" 
/LIBPATH:"(...)\Microsoft SDKs\Windows\v7.0A/Lib" /
/LIBPATH:"(...)\xerces-c-3.1.1\Build\C2C\Release" 
winmm.lib user32.lib psapi.lib 
(many .obj-s and .res) 
(the xerces's lib is actually excluded from building) 

修改

我忘记了。 - 当使用VC7.1代替VC9时,库正确构建。

EDIT2 boost_python-vc71-mt-1_32.lib不是问题。从链接中删除此文件后,仍然存在提到的错误。

1 个答案:

答案 0 :(得分:2)

您的编辑表明问题与模板无关,而是与运行时库的不一致包含。 例如,您告诉链接器使用boost_python-vc71-mt-1_32.lib并说它适用于VC7.1但不适用于VC9。
首先,确保为新版本的visual studio构建适当的boost库。
其次,尽管这是一个相关点,但请确保您使用的任何库都依赖于相同的运行时。