gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:40:35 24 4
gpt4 key购买 nike

我在 Visual Studio 2012 中使用 Intel C++ 13.0.1.119 Build 20121008 for IA-32 在 Windows 上运行。我一直遇到链接器错误问题,并将其缩小到选项 /Qcheck-pointers:读写。每当我使用 /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

我找到了 this article ,表明可以通过使用 /Qcheck-pointers-undimensioned- 关闭对无维数组的检查来解决这个问题。然而,这似乎没有效果,我得到了同样的链接器错误。

有谁知道如何解决这个链接问题?

更新:根据 Eric Shiyin Kang 的建议,我将 /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。

最佳答案

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

一个被打包成gtestd.lib通过选项 /MTd在 gtest 项目中然后你试图打包 gtestd.lib进入Project2.exe .

另一个会被打包成Project2.exe直接通过 /MTdProject2.exe的项目中.

解决方案可能是

1) 使用 /MDd , /MTd , /MD/MTd不断地参与所有涉及的项目,或者

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

关于c++ - ICC 指针检查的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14494318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com