UE4
调试第三方库相关问题
UE4
可以集成第三方库(包含自己编写的库),往往需要UE4
和第三方库一起调试,因此需要使用第三方库的调试版本。以版本UE4.9.2
来研究相关问题。
UE4
默认支持的运行库类型
UE4
的编译器默认不支持使用debug
版本的第三方库。只有在解决方案配置为Debug
且BuildConfiguration.bDebugBuildsActuallyUseDebugCRT=true
的情况下支持使用debug
版本的第三方库。
在源码文件VCToolchain.cs
有相关设置:默认选项为Arguments.Append(" /MD")
,即多线程DLL[/MD]
。
多线程[/MT]:0
多线程调试[/MTd]:1
多线程DLL[/MD]:2
多线程调试DLL[/MDd]:3
// Specify the appropriate runtime library based on the platform and config.
if( CompileEnvironment.Config.bUseStaticCRT )
{
if( CompileEnvironment.Config.Target.Configuration == CPPTargetConfiguration.Debug && BuildConfiguration.bDebugBuildsActuallyUseDebugCRT )
{
if( WindowsPlatform.bUseVCCompilerArgs )
{
Arguments.Append(" /MTd");
}
else
{
AddDefinition( Arguments, "_MT" );
AddDefinition( Arguments, "_DEBUG" );
}
}
else
{
if( WindowsPlatform.bUseVCCompilerArgs )
{
Arguments.Append(" /MT");
}
else
{
AddDefinition( Arguments, "_MT" );
}
}
}
else
{
if( CompileEnvironment.Config.Target.Configuration == CPPTargetConfiguration.Debug &&BuildConfiguration.bDebugBuildsActuallyUseDebugCRT )
{
if( WindowsPlatform.bUseVCCompilerArgs )
{
Arguments.Append(" /MDd");
}
else
{
AddDefinition( Arguments, "_MT" );
AddDefinition( Arguments, "_DEBUG" );
AddDefinition( Arguments, "_DLL" );
}
}
else
{
if( WindowsPlatform.bUseVCCompilerArgs )
{
//默认情况下,设置为此选项
Arguments.Append(" /MD");
}
else
{
AddDefinition( Arguments, "_MT" );
AddDefinition( Arguments, "_DLL" );
}
}
}
UE4
链接调试版第三方静态库问题
UE4 C++
模块链接静态库的时候出现错误:
检测到“_ITERATOR_DEBUG_LEVEL”
的不匹配项: 值“2”
不匹配值“0”
。
检测到“RuntimeLibrary”
的不匹配项: 值“MDd_DynamicDebug”
不匹配值“MD_DynamicRelease”
。
原因主要是编译项目与项目中所使用的链接库debug/release
版本不对应和运行时设置不一致。
解决方案
- 修改源码
VCToolchain.cs
的相应的内容:注释掉条件(默认情况下解决方案配置Debug
才可以链接/MDd
的三方库)。
if( /*CompileEnvironment.Config.Target.Configuration == CPPTargetConfiguration.Debug &&*/ BuildConfiguration.bDebugBuildsActuallyUseDebugCRT )
{
if( WindowsPlatform.bUseVCCompilerArgs )
{
Arguments.Append(" /MDd");
}
else
{
AddDefinition( Arguments, "_MT" );
AddDefinition( Arguments, "_DEBUG" );
AddDefinition( Arguments, "_DLL" );
}
}
- 修改
XXXXEditorTarget.cs
public XXXXEditorTarget(TargetInfo Target)
{
Type = TargetType.Editor;
BuildConfiguration.bDebugBuildsActuallyUseDebugCRT = true;
}
- 设置解决方案配置为
Debug Editor
。