У меня есть потоковый текст из библиотеки DLL на std::cerr
. Связывание EXE (через LoadLibrary()
) с этой DLL необходимо для потоковой передачи текста.
Я использую VS90.
Я использую следующий класс в EXE для перенаправления:
struct cerr_redirect {
cerr_redirect( std::streambuf * new_buffer )
: old( std::cerr.rdbuf( new_buffer ) )
{ }
~cerr_redirect( ) {
std::cerr.rdbuf( old );
}
private:
std::streambuf * old;
};
Это работает нормально, если и DLL, и EXE созданы с использованием одной и той же конфигурации (либо Debug, либо Release). Однако при запуске EXE, созданного в Release, с DLL, созданной для отладки, перенаправление не работает, и ни один из cerr
выходных данных, созданных в DLL, не попадает в EXE.
ИЗМЕНИТЬ
Библиотека времени выполнения связана динамически. DLL, созданная для отладки, связывается с «Многопоточной DLL-отладкой (/ MDd)», а встроенная в Release EXE-версия связана с «Многопоточной DLL (/ MD)».
Я подозреваю, что это причина такого поведения; Я считаю, что std::cerr
живет в ЭЛТ. Таким образом, когда и DLL, и EXE используют один и тот же CRT, они используют одну и ту же std::cerr
, в противном случае у каждой из них есть собственная копия.
Может ли кто-нибудь подтвердить, правильно ли я понимаю?
Если да, то я думаю, что решение моей проблемы состоит в том, чтобы определить мой собственный глобальный поток в EXE и позволить DLL перенаправить на него cerr
. Или есть более изящное решение?
std::cerr
. Простой выход из этой привязки - прекратить смешивать выпускные и отладочные сборки. - person David Heffernan   schedule 08.09.2014