2017-02-27 45 views
1

我已經成功構建了一個boost示例rotate_file(boost 1.63)使用我自己的cmake文件而不是jamfile。然後,我必須補充以下修改:boost log - 使用全局記錄器時未定義的參考

#include <boost/log/sources/global_logger_storage.hpp> 
... 
//before main 
BOOST_LOG_GLOBAL_LOGGER(my_logger, src::logger) 
... 
//src::logger lg; 
src::logger& lg = my_logger::get(); 

的程序也包含此行:

#define BOOST_ALL_DYN_LINK 

這裏有cmake的庫:

target_link_libraries(test "libboost_log.so" 
          "libboost_log_setup.so" 
          "libboost_date_time.so" 
          "libboost_filesystem.so" 
          "libboost_system.so" 
          "libboost_thread.so") 

這條線:

src::logger& lg = my_logger::get(); 

生成:

global_logger_storage.hpp:154: error: undefined reference to `my_logger::construct_logger()' 

有什麼問題?

編輯

我添加水槽和其他屬性是這樣的:

logging::core::get()->add_sink(sink); 
logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock()); 
logging::core::get()->add_global_attribute("RecordID", attrs::counter< unsigned int >()); 

因此在BOOST_LOG_GLOBAL_LOGGER_INIT結束時,我只需要添加:

src::logger logger; 
return logger; 

它的工作原理。

回答

2

您需要致電BOOST_LOG_GLOBAL_LOGGER_INIT。在一個項目中,我有一個頭的情況如下:

// register a global logger 
BOOST_LOG_GLOBAL_LOGGER(logger, boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>) 

在源文件中我有這樣的:

BOOST_LOG_GLOBAL_LOGGER_INIT(logger, src::severity_logger_mt) { 
    src::severity_logger_mt<boost::log::trivial::severity_level> logger; 

    // add attributes 
    logger.add_attribute("LineID", attrs::counter<unsigned int>(1)); // lines are sequentially numbered 
    logger.add_attribute("TimeStamp", attrs::local_clock());    // each log line gets a timestamp 

    return logger; 
} 

當我註釋掉BOOST_LOG_GLOBAL_LOGGER_INIT,我得到了同樣的錯誤,你做的。我的演繹力量告訴我,BOOST_LOG_GLOBAL_LOGGER_INIT提供了您(我們)需要的定義。

+0

作品,請參閱編輯 – Irbis

+0

正如您在文檔中看到的(http://www.boost.org/doc/libs/1_63_0/libs/log/doc/html/log/detailed/sources.html#log .detailed.sources.global_storage),還有一些其他的宏來定義記錄器的初始化。通過編輯判斷,您可以使用'BOOST_LOG_GLOBAL_LOGGER_DEFAULT'。 –