3

我在 VS 中使用 CMake 创建了项目。后来我添加了 boost 和 gmock 用法。GMock 强迫我在解决方案中的所有项目(主 exe、插件、dll、UT)上设置 /MT 标志。现在我面临一个奇怪的问题。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 库?还是别的什么?

4

0 回答 0