boost.log error occured while using sink.set_filter - boost-log

I use boost.log for my project.
But when I tried to set filter for sinks, compilation errors came.
code are simple:
BOOST_LOG_ATTRIBUTE_KEYWORD(MyTag, "My_Tag", std::string);
BOOST_LOG_INLINE_GLOBAL_LOGGER_CTOR_ARGS(
my_logger
, boost::log::sources::channel_logger_mt< >
, (boost::log::keywords::channel = "default"))
typedef boost::log::sinks::synchronous_sink<
boost::log::sinks::text_ostream_backend > TextSink;
boost::shared_ptr< TextSink > logSink = boost::make_shared< TextSink >();
auto backSink = boost::make_shared<std::ofstream>("default.log");
!!! compilation error, no add_attribute in channel_logger !!!
my_logger::get().add_attribute("My_Tag"
, boost::log::attributes::constant<String>("My_Tag"));
logSink->set_filter(
boost::log::expressions::has_attr(MyTag)
!!! compilation error, invalid operand expression between attribute_actor and std::string !!!
&& boost::log::expressions::attr<std::string>("My_Tag")==std::string("My_Tag")
!!! compilation error, invalid operand expression between attribute_keyword<tag::MyTag> and char[7] !!!
&& MyTag=="My_Tag"
I also tried to define filter function, but got following error:
bool my_filter(
boost::log::value_ref< std::string
!!! compilation error, no tag_attr in boost::log::expressions::tag !!!
, boost::log::expressions::tag::tag_attr > const& tag)
{
return level >= warning || tag == "IMPORTANT_MESSAGE";
}
By the way, I also have following error, but this error will disappear if all other compilation errors were solved.
!!! no open_record in severity_logger_mt !!!
BOOST_LOG_SEV(slg, normal) << "A regular message";
could anyone help me?
full code :
#include <boost/phoenix/operator.hpp>
#include <boost/log/sources/channel_logger.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/attributes/attribute.hpp>
#include <boost/log/attributes/attribute_cast.hpp>
#include <boost/log/keywords/filter.hpp>
#include <boost/log/expressions/predicates.hpp>
#include <boost/log/expressions/attr_fwd.hpp>
#include <boost/log/expressions/attr.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks.hpp>
BOOST_LOG_INLINE_GLOBAL_LOGGER_CTOR_ARGS(
my_channel_logger
, boost::log::sources::channel_logger_mt< >
, (boost::log::keywords::channel = "channel"))
BOOST_LOG_ATTRIBUTE_KEYWORD(MyTag, "My_Tag", std::string);
typedef boost::log::sinks::synchronous_sink<
boost::log::sinks::text_ostream_backend > TextSink;
static boost::shared_ptr< TextSink > logSink = boost::make_shared< TextSink >();
static auto backSink = boost::make_shared<std::ofstream>("output.log");
void func() {
!!! compilation error, no 'open_record' in channel_logger_mt !!!
BOOST_LOG_CHANNEL(my_channel_logger::get(), "channel")<<"channel log";
!!! compilation error, no add_attribute in channel_logger !!!
my_channel_logger::get().add_attribute("My_Tag"
, boost::log::attributes::constant<String>("My_Tag"));
}
compilation error for no open_record in channel_logger_mt:
***.cpp:87:5: error: no member named 'open_record' in 'boost::log::v2_mt_nt6::sources::channel_logger_mt<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >'
channel_feature.hpp:236:41: note: expanded from macro 'BOOST_LOG_CHANNEL'
channel_feature.hpp:231:5: note: expanded from macro 'BOOST_LOG_STREAM_CHANNEL'
record_ostream.hpp:566:5: note: expanded from macro 'BOOST_LOG_STREAM_WITH_PARAMS'
record_ostream.hpp:555:50: note: expanded from macro 'BOOST_LOG_STREAM_WITH_PARAMS_INTERNAL'
compilation error for no add_attribute in channel_logger_mt:
***.cpp:76:31: error: no member named 'add_attribute' in 'boost::log::v2_mt_nt6::sources::channel_logger_mt<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >'

Most likely, you're missing #includes in your code.
!!! compilation error, no add_attribute in channel_logger !!!
my_logger::get().add_attribute("My_Tag"
, boost::log::attributes::constant<String>("My_Tag"));
add_attribute is defined by basic_composite_logger, from which channel_logger_mt derives. You need to include boost/log/sources/channel_logger.hpp.
!!! compilation error, invalid operand expression between attribute_actor and std::string !!!
&& boost::log::expressions::attr<std::string>("My_Tag")==std::string("My_Tag")
!!! compilation error, invalid operand expression between attribute_keyword<tag::MyTag> and char[7] !!!
&& MyTag=="My_Tag"
Most likely, you're missing an include of boost/phoenix/operator.hpp. Or you can include boost/log/expressions.hpp, which automatically includes it for you.
!!! no open_record in severity_logger_mt !!!
BOOST_LOG_SEV(slg, normal) << "A regular message";
Same as with channel_logger_mt. You need to include boost/log/sources/severity_logger.hpp.
Note that for every component in the docs, there is a list of associated Boost.Log headers in the very beginning of the section. Here is an example for the severity logger.
Update on 2019-07-03:
Your full code compiles, if the following includes are added:
#include <string>
#include <fstream>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/make_shared_object.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/record_ostream.hpp>
I also had to remove the "!!!" lines and use std::string instead of String in the constant attribute.
In general, you have to include a header for every component you use in your code.

Related

How to handle redefinition of Macro?

My C code is like bellow.
// file.c
#include <stdio.h>
#define value 10
#define value 20
void func()
{
printf("%d\n",value);
}
My Interface file is like bellow.
//sample.i
%module sample
%{
#include "func.c"
%}
%include "func.c"`
When I run the command "swig -python sample.i", I am getting the error like bellow.
Macro 'value' redefined. The previous definition of 'value' is there.
How to handle this?
Interesting that swig considers it an error, but the compiler (mine anyway) considers it a warning. If you can't fix the header, you can do:
//sample.i
%module sample
%{
#include "func.c"
%}
#define value 20
void func()
{
printf("%d\n",value);
}
Basically, expand the header file inline and remove the offending line from swig processing. Otherwise, fix the header.

Using regex_iterator to go through the tags of an HTML file

I'm writing a web browser and trying to use regex_iterator to go through the tags of an HTML document and ultimately create a document tree. First I need a regular expression that will get me an HTML tag. The following should print out each HTML tag
#include <string>
#include <regex>
#include <iostream>
int main()
{
std::string s("<!DOCTYPE html><head></head><body><div class='container' id='someId'><p>Here's a p tag</p><p>Here's another p tag</p></div></body>");
std::regex e("[someRegularExpression]");
std::regex_iterator<std::string::iterator> htmlTagRover ( s.begin(), s.end(), e );
std::regex_iterator<std::string::iterator> offend;
while (htmlTagRover != offend)
std::cout << htmlTagRover->str() << std::endl;
return 0;
}
if [someRegularExpression] is equal to a regular expression for an HTML tag. Bur I'm getting the following error when I try to run the program:
/home/svzQOJ/ccEMKoqM.o: In function main':
prog.cpp:(.text.startup+0xd1): undefined reference tostd::regex_iterator<__gnu_cxx::__normal_iterator, char, std::regex_traits >::regex_iterator(__gnu_cxx::__normal_iterator, __gnu_cxx::__normal_iterator, std::basic_regex > const&, std::bitset<11u>)'
prog.cpp:(.text.startup+0xdc): undefined reference to std::regex_iterator<__gnu_cxx::__normal_iterator<char*, std::string>, char, std::regex_traits<char> >::regex_iterator()'
prog.cpp:(.text.startup+0x1af): undefined reference tostd::regex_iterator<__gnu_cxx::__normal_iterator, char, std::regex_traits >::operator!=(std::regex_iterator<__gnu_cxx::__normal_iterator, char, std::regex_traits > const&)'
prog.cpp:(.text.startup+0x1be): undefined reference to `std::regex_iterator<__gnu_cxx::__normal_iterator, char, std::regex_traits >::operator->()'
collect2: error: ld returned 1 exit status
Any idea why?
According to here, you don't need the <std::string::iterator> in your calls and you need to use the std::sregex_iterator (notice the s) to use regex with std::string.

undefined reference to `htmlcxx::HTML::ParserDom::parseTree(std::string const&)'

I am using htmlcxx library for a simple program but I got stuck in a problem, I searched many other related solutions but my problem is still a problem, Hope any one can help me, Here is the code I used in Kdevelop on Ubuntu:
#include <iostream>
#include <string>
#include <htmlcxx/html/ParserDom.h>
using namespace htmlcxx;
int main()
{
//Parse some html code
std::string html = "<html><body>hey</body></html>";
HTML::ParserDom parser;
tree<HTML::Node> dom= parser.parseTree(html) ;
//Print whole DOM tree
std::cout << dom << std::endl;
//Dump all links in the tree
tree<HTML::Node>::iterator it = dom.begin();
tree<HTML::Node>::iterator end = dom.end();
for (; it != end; ++it)
{
if (it->tagName() == "A")
{
it->parseAttributes();
std::cout << it->attribute("href").second;
}
}
//Dump all text of the document
it = dom.begin();
end = dom.end();
for (; it != end; ++it)
{
if ((!it->isTag()) && (!it->isComment()))
{
std::cout << it->text();
}
}
return 0;
}
And here is the error come when I build it in Kdevelop:
/home/ratior/projects/html/build> make -j2
Scanning dependencies of target html
[100%] Building CXX object CMakeFiles/html.dir/main.o
Linking CXX executable html
CMakeFiles/html.dir/main.o: In function `main':
/home/ratior/projects/html/main.cpp:17: undefined reference to `htmlcxx::HTML::ParserDom::parseTree(std::string const&)'
/home/ratior/projects/html/main.cpp:20: undefined reference to `htmlcxx::HTML::operator<<(std::ostream&, tree<htmlcxx::HTML::Node, std::allocator<tree_node_<htmlcxx::HTML::Node> > > const&)'
/home/ratior/projects/html/main.cpp:29: undefined reference to `htmlcxx::HTML::Node::parseAttributes()'
CMakeFiles/html.dir/main.o: In function `htmlcxx::HTML::ParserDom::ParserDom()':
/usr/local/include/htmlcxx/html/ParserDom.h:14: undefined reference to `vtable for htmlcxx::HTML::ParserDom'
CMakeFiles/html.dir/main.o: In function `htmlcxx::HTML::ParserDom::~ParserDom()':
/usr/local/include/htmlcxx/html/ParserDom.h:15: undefined reference to `vtable for htmlcxx::HTML::ParserDom'
collect2: error: ld returned 1 exit status
make[2]: *** [html] Error 1
make[1]: *** [CMakeFiles/html.dir/all] Error 2
make: *** [all] Error 2
*** Failure: Exit code 2 **strong text**
Wrong path to the library is the reason why it's not linking the code.

swig error: Extraneous #endif

When I executed the swig command on my .i file, I am getting an error on an include file.
The error says:
../include/example.h: Error: Extraneous #endif.
The contents of the example.h file is as below:
#ifndef EXAMPLE_H
#define EXAMPLE_H
namespace my_example {
class BaseExample {
public:
virtual ~BaseExample() {}
};
}
#endif /* EXAMPLE_H */
In the above code, the #endif correctly matches with #ifndef.
So, why is swig reporting "Extraneous #endif." ?
I finally found the problem and solved it.
I think, the file had BOM marks in the end of file.
So, I executed
:set nobomb
inside my vim editor, and the error went away.

CUDA: Error while compiling my first cuda program

I am very new to CUDA programming.. I wrote my first code and when I compiled it, it is showing me a lots of error. Can anyone tell me what is wrong
the code
#include <stdio.h>
#include "cuda.h"
#include <stdlib.h>
__global__ void kernel(void) {
}
int main(int argc, char *argv[])
{
kernel<<<1,1>>>();
printf("finished \n");
return 0;
}
The errors are
cuda.c:5: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âvoidâ
cuda.c:7: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âvoidâ
cuda.c: In function âmainâ:
cuda.c:12: error: âkernelâ undeclared (first use in this function)
cuda.c:12: error: (Each undeclared identifier is reported only once
cuda.c:12: error: for each function it appears in.)
cuda.c:12: error: expected expression before â<â token
I compiled using
nvcc cuda.c
Can anyone tell me what mistake I am making....
nvcc runs .c files through the normal C compiler. Rename your file to cuda.cu.