C++ ICC指针检查的链接器错误

C++ ICC指针检查的链接器错误,c++,visual-studio,icc,C++,Visual Studio,Icc,我在Visual Studio 2012中使用Windows上的英特尔C++ +130.1.119构建20121008用于IA32。我一直遇到链接器错误的问题,并将其缩小到选项/Qcheck-pointers:rw。每当我使用/Qcheck指针:rw编译时,都会出现以下错误: 1> xilink: executing 'link' 1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(u

我在Visual Studio 2012中使用Windows上的英特尔C++ +130.1.119构建20121008用于IA32。我一直遇到链接器错误的问题,并将其缩小到选项
/Qcheck-pointers:rw
。每当我使用
/Qcheck指针:rw
编译时,都会出现以下错误:

1>  xilink: executing 'link'
1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj)
1>libcmt.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in LIBCMTD.lib(invarg.obj)
1>libcpmtd.lib(xdebug.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Y:\...\ : fatal error LNK1169: one or more multiply defined symbols found
我发现,这表明可以通过使用
/Qcheck指针undimensioned-
关闭对未标注尺寸的数组的检查来解决。然而,这似乎没有效果,我得到了同样的链接器错误

有人知道如何解决这个链接问题吗

更新:根据Eric Shiyin Kang的建议,我在命令行中保留了
/Qcheck指针:rw
/Qcheck指针未标注尺寸-
,但添加了
/NODEFAULTLIB:libcmt.lib
作为链接器命令。这导致我得到一个不同的链接器错误:

1>  xilink: executing 'link'
1>libcpmt.lib(nothrow.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in libcpmtd.lib(stdthrow.obj)
1>libcpmt.lib(nothrow.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in libcpmtd.lib(stdthrow.obj)
1>Y:\..\.exe : fatal error LNK1319: 2 mismatches detected
更新2: 以下是完整的编译器命令行:

/RTCc /GS /Qcheck-pointers:rw /debug:expr-source-pos /W5 /Gy /Zc:wchar_t /I"\..\include\gtest" /I"\..\include\" /Zi /Od /Qintel-extensions- /Fd"Debug\vc110.pdb" /fp:precise /D "_VARIADIC_MAX=10" /D "_MBCS" /Qipo /Zc:forScope /RTC1 /Qcheck-pointers-undimensioned- /Gd /MTd /Fa"Debug\" /EHsc /nologo /Za /Fo"Debug\" /Fp"Debug\Project2.pch" 
/OUT:"\..\Project2.exe" /MANIFEST /NXCOMPAT /PDB:"\..\Project2.pdb" /DYNAMICBASE "gtestd.lib" "gtest_maind.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /OPT:REF /SAFESEH / /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\Project2.exe.intermediate.manifest" /OPT:ICF /NOLOGO /LIBPATH:"\..\include\gtest\debug_build" /TLBID:1 /NODEFAULTLIB:libcmt.lib
以下是完整链接器命令行:

/RTCc /GS /Qcheck-pointers:rw /debug:expr-source-pos /W5 /Gy /Zc:wchar_t /I"\..\include\gtest" /I"\..\include\" /Zi /Od /Qintel-extensions- /Fd"Debug\vc110.pdb" /fp:precise /D "_VARIADIC_MAX=10" /D "_MBCS" /Qipo /Zc:forScope /RTC1 /Qcheck-pointers-undimensioned- /Gd /MTd /Fa"Debug\" /EHsc /nologo /Za /Fo"Debug\" /Fp"Debug\Project2.pch" 
/OUT:"\..\Project2.exe" /MANIFEST /NXCOMPAT /PDB:"\..\Project2.pdb" /DYNAMICBASE "gtestd.lib" "gtest_maind.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /OPT:REF /SAFESEH / /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\Project2.exe.intermediate.manifest" /OPT:ICF /NOLOGO /LIBPATH:"\..\include\gtest\debug_build" /TLBID:1 /NODEFAULTLIB:libcmt.lib

我正在使用GTest库和多线程调试运行库,以匹配GTest。

基于讨论,并且由于您在
Project2.exe
项目中使用了手动构建的库
gtestd.lib
,我认为问题在于,您试图通过静态链接或动态链接将不同版本的C运行时库(如
libcmt.lib/libcmtd.lib
)打包到可执行文件
Project2.exe
)中

通过gtest项目中的选项
/MTd
将一个文件打包到
gtestd.lib
中,然后尝试将
gtestd.lib
打包到
Project2.exe

另一个将通过
Project2.exe
项目中的
/MTd
直接打包到
Project2.exe

解决办法可能是

1) 在所有涉及的项目中经常使用
/MDd
/MTd
/MD
/MTd
,或


2) 使用
/NODEFAULTLIB
/NODEFAULTLIB:
构建静态/动态库(如
gtest.lib
)时,不要在中链接任何外部库。并且在构建可执行文件时只链接这些lib。

看起来您同时链接了libcmt和libcmtd。err msg建议您使用
/NODEFAULTLIB:library
。你试过了吗?@EricShiyinKang我试过了,但似乎ICL链接器没有意识到这一点。我得到了警告icl:warning#10006:忽略未知选项'/NODEFAULTLIB:library'。所有错误都保持不变。可能您应该传递给链接器/编译器的确切选项是
/NODEFAULTLIB:libcmt.lib
。另一方面,您似乎将调试/发布lib混合在一起。您可以检查您链接的库是否与编译模式匹配。@EricShiyinKang我将其绑定,并得到一个不同的链接器错误。请看上面我的更新。试着在调试模式下重复所有这些,尤其是当你打算检查指针时。你刚刚救了我的命,这是很有价值的信息。