gpt4 book ai didi

compiler-construction - 编译 Debug模式时出错 : C++/CLI - error LNK2022

转载 作者:行者123 更新时间:2023-12-04 00:15:36 24 4
gpt4 key购买 nike

我有一个封装了 C++ DLL 的 CLI 代码。
当我尝试在 Debug模式下编译它时,出现以下错误:

Error 22 error LNK2022: metadata operation failed (8013118D) :

Inconsistent layout information induplicated types .... MSVCMRTD.lib (locale0_implib.obj)

奇怪的是,在 Release 模式下它编译正常并且工作正常。
我能看到导致问题的唯一区别是我更改时:

配置属性 -> C/C++ -> 代码生成 -> 运行时库

当它设置为:Multi-threaded Debug DLL (/MDd) 时它会抛出错误。
当它设置为:Multi-threaded DLL (/MD) 时编译正常。

相同的设置适用于项目中的所有其他 DLL(CLI 和 C++),并且它们继承相同的属性。

我正在使用 VS2010。

那么,我该如何解决呢?

我能解释一下为什么会这样吗?

更新:

我基本上尝试过更改项目属性中的每个选项,但没有成功。

我在某处读到这可能是由同名类型的重复声明引起的。
但在 CLI 文件中,我从 std 显式调用 std::string 等。

  • 重命名对象无效

还有其他想法吗?

更新:

一些错误复制粘贴:

error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<char,std::allocator<char> >): (0x02000097).  E:\MyProject....\MSVCMRTD.lib(locale0_implib.obj)   DllName


error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000091). E:\MyProject....\MSVCMRTD.lib(locale0_implib.obj) AnotherDllName

请注意,MSVCMRTD.lib 文件实际上是一个用于编译的 MS 文件,实际上不在我的项目中(也不应该在)

更新

如果这对您有帮助,这里是链接器命令行:

/OUT:"E:\blah.CLI.dll" /INCREMENTAL /NOLOGO /LIBPATH:"e:\blah\Output\" /LIBPATH:"E:\blah\lib_64" /LIBPATH:"blah\Lib_64\" /DLL "e:\Otheblaf.lib" /MANIFEST /ManifestFile:"x64\Debug\blah.CLI.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\blah.CLI.pdb" /SUBSYSTEM:WINDOWS /OPT:NOREF /OPT:NOICF /PGD:"E:\blah.CLI.pgd" /TLBID:1 /DYNAMICBASE:NO /FIXED:NO /MACHINE:X64 /ERRORREPORT:QUEUE

以及确实有效的版本:

/OUT:"E:\blah.CLI.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\blah\" /LIBPATH:"E:\blah\Output\" /LIBPATH:"E:\blah\lib_64" /DLL "Configuration.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" "E:\blah.lib" /MANIFEST /ManifestFile:"blah.CLI.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\blah.CLI.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /PGD:"E:\blah.CLI.pgd" /LTCG /TLBID:1 /DYNAMICBASE /FIXED:NO /MACHINE:X64 /ERRORREPORT:QUEUE

最佳答案

您在构建项目时是否使用自定义生成文件或自定义编译器参数?这可能会以难以想象的方式破坏项目。

[a] 构建该 DLL 期间的 pragma pack 设置可能被设置为自定义编译器设置,这导致 Windows 标准 header 中的结构被错误地打包,从而导致大小不匹配。易于修复 .. 检查 cl.exe 的 -Zp 设置
这种情况可能会解决结构是您自己的自定义结构或类之一的情况。

http://msdn.microsoft.com/en-us/library/xh3e3fd0%28v=VS.71%29.aspx

[b] 另一种可能发生这种情况的情况是,当其中一个头文件包含 Windows 标准头文件并且 pragma 包尚未恢复时。然后,这会将不正确的包信息传播到标准 header ,从而导致与上述相同的问题。通常很容易解决,首先包括所有(通过简化的方式)窗口标题,以便稍后跳过它们。

希望这对您有所帮助。

关于compiler-construction - 编译 Debug模式时出错 : C++/CLI - error LNK2022,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4842205/

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