2013-01-24 1 views
2

Visual Studio 2012에서 Windows에서 실행되는 IA-32 용 Intel C++ 13.0.1.119 Build 20121008을 사용하고 있습니다. 링커 오류와 관련된 문제가있어 /Qcheck-pointers:rw 옵션으로 좁혀졌습니다. 내가 /Qcheck-pointers:rw 컴파일 할 때마다, 나는 다음과 같은 오류를 얻을 : ICC 포인터 검사 링커 오류

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)" ([email protected]@[email protected]) 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)" ([email protected]@[email protected]) 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-pointers-undimensioned-를 사용하여 길이를 모르는 배열을 검사 해제에 의해 해결 될 수 있음을 나타냅니다 this article을 발견했다. 그러나 이것은 아무 효과가없는 것 같았고 동일한 링커 오류가 발생했습니다.

누구든지이 링크 문제를 해결하는 방법을 알고 있습니까?

업데이트

: 에릭 Shiyin 강의 제안에 따라, 나는 명령 행에서 /Qcheck-pointers:rw/Qcheck-pointers-undimensioned-을 떠났지만 링커 명령으로 /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 : 여기 전체 컴파일러 명령 줄입니다 :

/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" 

전체 링커 명령 라인이 다른 링커 오류가 나 결과

저는 GTest 라이브러리를 사용 중이며 GTest와의 일치를 위해 Multi-Threaded Debug 런타임 라이브러리를 사용하고 있습니다. 당신이 Project2.exe의 프로젝트에 수동으로 내장 된 라이브러리 gtestd.lib을 사용하기 때문에

+1

libcmt와 libcmtd를 동시에 연결 한 것으로 보입니다. err msg는'/ NODEFAULTLIB : library'를 사용할 것을 제안합니다. 너 그거 해봤 니? – kangshiyin

+0

@EricShiyinKang 해봤지만 ICL 링커가 인식하지 못하는 것처럼 보입니다. 'icl : warning # 10006 : 알 수없는 옵션 무시하기 '/ NODEFAULTLIB : library'' 경고가 나타납니다. 모든 오류는 동일하게 유지됩니다. –

+1

아마도 링커/컴파일러에 전달해야 할 정확한 옵션은'/ NODEFAULTLIB : libcmt.lib'입니다. 다른 한편으로, 당신은 디버그/릴리스 libs 함께 섞어 보인다.링크 된 라이브러리가 컴파일 모드와 일치하는지 확인할 수 있습니다. – kangshiyin

답변

5
논의를 바탕으로

하고, 그 문제는 당신이 당신의 실행 파일 Project2.exe로 같은 libcmt.lib/libcmtd.lib을에서는 lib C 런타임의 다른 버전을 포장하려는 생각 정적 연결 또는 동적 연결 중 하나를 사용합니다.

하나는 gtest 프로젝트의 옵션 /MTd에 의해 gtestd.lib로 포장되고 당신은 Project2.exegtestd.lib 팩을 시도하고있다.

다른 하나는 Project2.exe 프로젝트에서 /MTd에 의해 직접 Project2.exe에 포장됩니다.

이 솔루션은

1)에서 외부 라이브러리를 연결하지 않는 /MDd, /MTd, /MD 또는 관련된 모든 프로젝트에 지속적으로 /MTd, 또는

2

)를 사용할 수 정적을 만들 때/동적 라이브러리, 예 : gtest.lib, /NODEFAULTLIB 또는 /NODEFAULTLIB:<name_of_some_of_def_libs>을 사용합니다. 실행 파일을 빌드 할 때 해당 libs 만 링크합니다.

+0

그게 다 했어, 고마워. –

+0

방금 ​​내 생명을 구했다. 이것은 귀중한 정보이다. –