开发者

Can't compile against Boost.log on OS X

I'm trying to build and run the tutorial examples for Boost.log and getting a compiler error that has me stumped and could use some help. Basic details; I've done a build of boost on OS X with boost.log included,yet when I try to compile any of the tutorial examples I get an overloaded 'operator>>' error from inside boost log's 'trivial.hpp' include file.

the errors are reported to be in

log/utility/explicit_operator_bool.hpp

here's the stack:

/usr/local/include/boost/log/utility/explicit_operator_bool.hpp:67:29: error: overloaded 'operator>>' must have at least one parameter of class or enumeration type [2]
In file included from /usr/local/include/boost/log/attributes/attribute_name.hpp:27:
In file included from /usr/local/include/boost/log/attributes/attribute_set.hpp:28:
In file included from /usr/local/include/boost/log/sources/basic_logger.hpp:37:
In file included from /usr/local/include/boost/log/sources/severity_logger.hpp:27:
In file included from /usr/local/include/boost/log/trivial.hpp:25:
In file included from /Volumes/Macintosh HD 2/code/Logging Tut   1/loggingTut1/loggingTut1/main.cpp:18:
Overloaded 'operator>>' must have at least one parameter of class or enumeration type in /usr/local/include/boost/log/utility/explicit_operator_bool.hpp

Had a good look around to see if anyone else had something like this and I found nothing - so can anyone explain what i've missed or what the problem might be?

The details:

I'm trying this on OS X (10.6.8) using Xcode 4.0.2

I have downloaded and built the 1_46_1 boost version and that works fine with my primary boost-based project (using Boost Asio, boost threads etc).

Boost.log is not in the main build yet so I downloaded it from sourceforge as in this question: boost-log-how-to-get-it-and-how-to-build-it

I copied the boost/log directory from the downloaded branch i开发者_如何学运维nto boost_1_46_1/boost/log directory, and copied the libs/log directory into the boost_1_46_1/libs/log

I removed all the boost stuff from /usr/local/include/boost and from /usr/local/lib and then re-built using:

./bootstrap.sh --with-libraries=all --prefix=/usr/local --includedir=/usr/local/include --libdir=/usr/local/lib

followed by

sudo ./bjam install > build.log

I checked the output for errors and it looks clean - nothing reported. I have all the boost libraries and headers under /usr/local. I checked my Asio project and it all works fine against this build (no boost log) . I created a new project for the log tutorials, set the library path and the include path and added lboost_log to the linker options.

The problem comes when trying to use the tutorial programs for Boost log - either as detailed in the Boost Log docs here or in the example included in the files from svn here

The example from SVN looks like this:

/*
 *          Copyright Andrey Semashev 2007 - 2011.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE_1_0.txt or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */
/*!
 * \file   main.cpp
 * \author Andrey Semashev
 * \date   07.11.2009
 *
 * \brief  An example of trivial logging.
 */

// #define BOOST_ALL_DYN_LINK 1
// #define BOOST_LOG_DYN_LINK 1

#include <boost/log/trivial.hpp>
#include <boost/log/core.hpp>
#include <boost/log/filters.hpp>

int main(int argc, char* argv[])
{
    // Trivial logging: all log records are written into a file
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    // Filtering may also be applied
    using namespace boost::log;

    core::get()->set_filter
    (
        filters::attr< trivial::severity_level >("Severity") >= trivial::info
    );

    // Now the first two lines will not pass the filter
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    return 0;
}

When I build the code, I get two errors:

Semantic Issue Overloaded 'operator>>' must have at least one parameter of class or enumeration type Semantic Issue Overloaded 'operator<<' must have at least one parameter of class or enumeration type

and the error is reported in the file explicit_operator_bool.hpp from Boost Log at these lines:

.
.
.
} // namespace boost

// These operators are not found through ADL
template< typename T > void operator<< (T const&,     boost::log::aux::unspecified_bool_type);
template< typename T > void operator>> (T const&, boost::log::aux::unspecified_bool_type);

#define BOOST_LOG_EXPLICIT_OPERATOR_BOOL()\
.
.
.

the stack I get in Xcode is as follows:

/usr/local/include/boost/log/utility/explicit_operator_bool.hpp:67:29: error: overloaded 'operator>>' must have at least one parameter of class or enumeration type [2]
In file included from /usr/local/include/boost/log/attributes/attribute_name.hpp:27:
In file included from /usr/local/include/boost/log/attributes/attribute_set.hpp:28:
In file included from /usr/local/include/boost/log/sources/basic_logger.hpp:37:
In file included from /usr/local/include/boost/log/sources/severity_logger.hpp:27:
In file included from /usr/local/include/boost/log/trivial.hpp:25:
In file included from /Volumes/Macintosh HD 2/code/Logging Tut   1/loggingTut1/loggingTut1/main.cpp:18:
Overloaded 'operator>>' must have at least one parameter of class or enumeration type in /usr/local/include/boost/log/utility/explicit_operator_bool.hpp


so kinda answering my own question (as it might help other Xcode/OSX users out there).

Looking at the explicit_operator.bool.hpp file, there is some conditional code in there that allows us to bypass the problem templates by setting:

#define BOOST_LOG_NO_UNSPECIFIED_BOOL

the tutorials then compile and run for me.

What i'm not sure about is why this is needed or what the effect downstream might be (note that like a lot of users, i'm interested in a quick and efficient way to get a lightweight logging framework and if we have to spend time investigating the inner workings of the framework it kinda nullifies the point...)

As the comment says, its not yet a supported library so perhaps its unfair to expect too much at this stage.

Chris

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜