Я создал проект с использованием CMake в VS. Позже я добавлю 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, что приводит к «Необработанному исключению в 0x77E58DC9 (ntdll.dll) в ComputerConfShop.exe: 0xC0000005: расположение записи нарушения доступа 0x00000014».
Должен ли я добавить какой-то конкретный флаг здания? Или gmock можно легко изменить с / MT на / MD библиотеку? Или что-то другое?
Задача ещё не решена.
Других решений пока нет …