2017-02-27 65 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'。 –