3

VS で CMake を使用してプロジェクトを作成しました。後でブーストと 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