から呼び出されたときに、私は今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内部-once- add_boost_log_console_sink();
同じコールを呼んでいました。
がフォーマットされた出力を生成してを調べてlibfoo内部のすべてのその後のBOOST_LOG_TRIVIAL(severity)
コール、exefoo内部のすべての同様の呼び出しはありませんでした。コードのモジュールの目的のために
、私はを調べてlibfooとexefooによって使用される新しいDLL、 liblog 、にこれらの関数を移動しました。現在、すべてのログはではなく、となっています。
このコードをDLLからロードしても、どうにかしても効果はありません。私はそれがしたいと思います。
Boost.Logと動的に(つまりDLLを)リンクしていますか?あなたは 'BOOST_LOG_DYN_LINK'または' BOOST_ALL_DYN_LINK'を定義しますか? –
私は 'libboost_log-vc140-mt-1_60.lib'と静的にリンクしています。しかし、* liblog *と* libfoo *はdllです。たぶん少なくとも* liblog *を静的ライブラリに変更する必要があります。 –
それが問題の原因です。 Boost.Logは、異なるモジュールから使用される場合、共有ライブラリとして構築する必要があります。 http://www.boost.org/doc/libs/1_62_0/libs/log/doc/html/log/installation/config.html –