成功解决qt_ros 报错:has_binary_operator.hp:52: Parse error at “BOOST_JOIN“
成功解决qt_ros 报错:
usr/include/boost/type_traits/detail/has_binary_operator.hpp:52: Parse error at "BOOST_JOIN"
make[2]: *** [include/modeldebug/moc_qnode.cxx] Error 1 make[2]: *** Waiting for unfinished jobs… usr/include/boost/type_traits/detail/has_binary_operator.hp:52
0 报错原因:
某个源文件多次(至少两次以上)包含了同一个头文件,所以才导致报错。
解决办法如下:
#ifndef起到的作用是防止一个源文件两次包含一个头文件。假如你有一个c源文件,它包含了多个头文件:头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。若在头文件A中定义了结构体或者类类型,编译时会报大量的重复定义错误。所以要用到# ifndef 与#endif,当第一次包含该头文件时,由于没有定义,条件为真,这样就会包含# ifndef 与#endif之间的代码,,当第二次包含头文件,前面已经定义好了,条件为假,# ifndef 与#endif之间的代码也不会再次包含,这样就避免重复定义了。
总结来说:
条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译。条件编译当然也可以用条件语句来实现, 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。
1. 打开has_binary_operator.hpp 文件
sudo gedit /usr/include/boost/type_traits/detail/has_binary_operator.hpp
2. 大致修改如下:修改参考 3具体修改
Modify “namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {…}”
修改为:
" #ifndef Q_MOC_RUN
namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) { #endif … #ifndef Q_MOC_RUN } #endif "
3. 具体修改如下 :
3.1在文件开头修改如下:
3.1.1 文件开头修改好的代码:
#ifndef Q_MOC_RUN
namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {
#endif
3.2在文件末端修改如下:
3.2.1 文件末修改好的代码:
#ifndef Q_MOC_RUN
} // namespace impl
#endif