0
에서 호출 할 때 나는 libfoo 이름과 Win32 콘솔 응용 프로그램 exefoo에 의해 사용되는, 광산의 DLL에 boost::log
의 출력 형식을 사용 작동하지 않습니다. 코드 libfoo의 주요 노출 대상에서부스트 :: 로그 형식은 DLL
// #include various boost log headers
void __declspec(dllexport) add_boost_log_console_sink()
{
boost::log::add_common_attributes();
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(boost::shared_ptr<std::ostream>(&std::cout, boost::null_deleter()));
sink->set_formatter(xspectra::get_our_formatter(false));
sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::info
&&
boost::log::expressions::has_attr(tag_attr) == false);
boost::log::core::get()->add_sink(sink);
}
boost::log::formatter __declspec(dllexport) get_our_formatter(bool bSubSeconds)
{
std::string sTimeStamp("%H:%M:%S");
if (bSubSeconds)
sTimeStamp += ".%f";
return boost::log::expressions::stream
//<< std::hex //To print the LineID in Hexadecimal format
<< std::setw(6) << std::setfill('0')
<< line_id
<< "\t"
<< boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", sTimeStamp)
<< " <" << boost::log::trivial::severity
<< "> \t"
/*
<< boost::log::expressions::if_(boost::log::expressions::has_attr(tag_attr))
[
boost::log::expressions::stream << "[" << tag_attr << "]\t" TAGS SUSPENDED
]
*/
<< boost::log::expressions::smessage;
}
이다, 나는 main()
의 exefoo 내부 add_boost_log_console_sink();
같은 전화를 -once- 호출했다.
포맷 출력을 생성했다libfoo 내부의 모든 후속 BOOST_LOG_TRIVIAL(severity)
전화 , exefoo 내부의 모든 유사한 전화가없는 동안.
DLL에서이 코드를로드하면 어떻게 든 효과가 나타나지 않는 것 같습니다. 나는 그것이 할 것이기를 바란다.
Boost.Log와 동적으로 (즉, dll) 연결합니까? 'BOOST_LOG_DYN_LINK' 또는'BOOST_ALL_DYN_LINK'을 정의합니까? –
나는 libboost_log-vc140-mt-1_60.lib와 정적으로 링크하고있다. 그러나 * liblog *와 * libfoo *는 dll입니다. 어쩌면 적어도 * liblog *를 정적 lib로 변경해야합니다. –
그게 문제의 원인입니다. Boost.Log는 다른 모듈에서 사용하는 경우 공유 라이브러리로 빌드해야합니다. http://www.boost.org/doc/libs/1_62_0/libs/log/doc/html/log/installation/config.html –