我在VS中使用CMake创建了项目。后来我添加了boost和gmock用法。 GMock强迫我在解决方案中的所有项目上设置/ MT标志(主exe,插件,dll,UT)。 现在我面临着奇怪的问题。 Log4Qt是我的日志库。在启动期间,在此库中深入创建记录器
mpTextStream = new QTextStream(stdout);
运行时“stdout”转到
/* These functions are for enabling STATIC_CPPLIB functionality */
_CRTIMP FILE * __cdecl __iob_func(void)
{
return _iob;
}
返回NULL(此_iob数组中的第一项不是NULL)。好的,我看到这些条目似乎是有效的,因为该表的初始化是
FILE _iob[_IOB_ENTRIES] = {
/* _ptr, _cnt, _base, _flag, _file, _charbuf, _bufsiz */
/* stdin (_iob[0]) */
{ _bufin, 0, _bufin, _IOREAD | _IOYOURBUF, 0, 0, _INTERNAL_BUFSIZ },
/* stdout (_iob[1]) */
{ NULL, 0, NULL, _IOWRT, 1, 0, 0 },
...
所以在结果时
void __cdecl _lock_file (
FILE *pf
)
{
/*
* The way the FILE (pointed to by pf) is locked depends on whether
* it is part of _iob[] or not
*/
if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )
{
/*
* FILE lies in _iob[] so the lock lies in _locktable[].
*/
_lock( _STREAM_LOCKS + (int)(pf - _iob) );
/* We set _IOLOCKED to indicate we locked the stream */
pf->_flag |= _IOLOCKED;
}
else
/*
* Not part of _iob[]. Therefore, *pf is a _FILEX and the
* lock field of the struct is an initialized critical
* section.
*/
EnterCriticalSection( &(((_FILEX *)pf)->lock) );
}
stdout未被识别为_iob数组的一部分,并且运行标准的EnterCriticalSection,导致ComputerConfShop.exe中的0x77E58DC9(ntdll.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x00000014。 我应该添加一些特定的建筑标志吗?或者gmock可以轻松地从/ MT更改为/ MD库?或其他什么?