Ошибка компоновщика с проверкой указателя ICC

Я использую Intel C ++ 13.0.1.119 Build 20121008 для IA-32, работающего под Windows в Visual Studio 2012. У меня были проблемы с ошибками компоновщика, и я сузил его до варианта /Qcheck-pointers:rw, Всякий раз, когда я компилирую с /Qcheck-pointers: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-pointers-undimensioned-, Однако, это, казалось, не имело никакого эффекта, и я получил те же ошибки компоновщика.

Кто-нибудь знает, как исправить эту проблему с ссылками?

Обновить: По предложению Эрика Шийин Канга я ушел /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:
Вот полная командная строка компилятора:

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

2

Решение

На основании обсуждения, и так как вы используете библиотеку, созданную вручную gtestd.lib в вашем проекте Project2.exe, Я думаю, что проблема в том, что вы пытаетесь упаковать разные версии библиотеки C времени выполнения, такие как libcmt.lib/libcmtd.lib в ваш исполняемый файл Project2.exeлибо статической связью, либо динамической связью.

Один упакован в gtestd.lib по выбору /MTd в проекте Gtest, а затем вы пытаетесь упаковать gtestd.lib в Project2.exe,

Другой будет упакован в Project2.exe непосредственно /MTd в проекте Project2.exe,

Решение может быть

1) использовать /MDd,/MTd,/MD или же /MTd постоянно во всех участвующих проектах, или

2) не связывать никакие внешние библиотеки при создании статической / динамической библиотеки, такой как gtest.lib, используя /NODEFAULTLIB или же /NODEFAULTLIB:<name_of_some_of_def_libs>, И связывайте эти библиотеки только при сборке исполняемых файлов.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]