2016-11-29 89 views
0

稱爲當我用格式化的boost::log輸出在我的DLL,名爲libfoo的和一個Win32控制檯應用程序exefoo使用。代碼是的boost ::日誌格式無效從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; 
} 

libfoo的的主體,公開的對象,我打電話-once-的main()exefooadd_boost_log_console_sink();相同的呼叫。

以後每BOOST_LOG_TRIVIAL(severity)呼叫libfoo的正在生產格式化輸出,而內部exefoo每一個類似的呼籲沒有。

對於代碼模塊性的目的,我移動這些功能到一個新的DLL,liblog,通過libfoo的exefoo使用。現在每個日誌都是而不是格式。

看來,這個代碼從某個DLL加載不會產生任何影響;我希望它能做到。

+0

你是否會動態鏈接Boost.Log(即dlls)?你定義了'BOOST_LOG_DYN_LINK'還是'BOOST_ALL_DYN_LINK'? –

+0

我沒有,我靜態鏈接到'libboost_log-vc140-mt-1_60.lib'。但是* liblog *和* libfoo *是dll。也許我應該至少將* liblog *改爲靜態庫。 –

+0

這是問題的根源。如果從不同模塊使用Boost.Log,則需要將其構建爲共享庫。 http://www.boost.org/doc/libs/1_62_0/libs/log/doc/html/log/installation/config.html –

回答

0

Andrey Semashev提供的洞察,我切換liblog配置類型從動態到靜態庫。現在一切正常。