编译boost库出现"_M_IX86_FP错误

来源:互联网 发布:大数据 宣传片 脚本 编辑:程序博客网 时间:2024/06/15 20:26
在将boost和我的程序生成的so动态库连接到mstar的UI后,发现编译出现错误:

[Compiling ./utility/src/StoreModeManager.cpp]
In file included from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/predef/hardware/simd.h:9:0,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/predef/hardware.h:14,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/predef.h:20,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/smart_ptr/detail/yield_k.hpp:28,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/smart_ptr/detail/spinlock_gcc_arm.hpp:12,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/smart_ptr/detail/spinlock.hpp:47,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/smart_ptr/detail/spinlock_pool.hpp:25,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/smart_ptr/shared_ptr.hpp:35,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/shared_ptr.hpp:17,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/detail/shared_ptr.hpp:23,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/detail/socket_ops.hpp:21,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/detail/socket_holder.hpp:20,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/detail/reactive_socket_accept_op.hpp:24,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/detail/reactive_socket_service.hpp:30,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/datagram_socket_service.hpp:30,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio/basic_datagram_socket.hpp:21,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/asio.hpp:21,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/ui/jarves/dropbox/include/BoostType.h:3,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/ui/jarves/dropbox/include/WebFileSystem.h:9,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/ui/jarves/mmbrowser/include/MSrv_WebMediaDrive.h:7,
                 from /home/chenweiqi/5_6586_ISDB/Supernova/projects/ui/jarves/mmbrowser/include/MSrv_MediaBrowser.h:100,
                 from utility/include/StoreModeManager.h:15,
                 from ./utility/src/StoreModeManager.cpp:1:
/home/chenweiqi/5_6586_ISDB/Supernova/projects/boost/boost/predef/hardware/simd/x86.h:104:76: error: "_M_IX86_FP" is not defined [-Werror=undef]
#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE__) || defined(_M_X64) || _M_IX86_FP >= 1)

但是单独使用Makefile去编译我写的测试程序,却没有出现错误。使用的都是相同的arm-none-linux-gnueabi,于是查下了boost库出问题的代码,发现了boost库中引用到_M_IX86_FP的地方:

#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE2__) || defined(_M_X64) ||  _M_IX86_FP >= 2))
#   define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE2_VERSION
#endif
#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE__) || defined(_M_X64) || _M_IX86_FP >= 1))
#   define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE_VERSION

在使用宏之前都没有先对宏进行检查,而我的测试程序能编译通过的原因可能是我在编译的时候没有指定警告的等级,所以可能默认等级低,所以对没有定义的宏也不会报编译错误
但使用正式的编译环境进行编译时对编译等级要求比较高,所以问题就暴露出来了。
为了解决编译问题,我在宏判断之前加上判断宏是否已经定义,发现这里就可以编译过了,但其他地方又报类似的问题。
既然是这么低级的编译错误,那不应该只有我会遇到啊,我怀疑这个问题会不会在高版本的boost库中被修复了,我当前使用的boost库是1.60.0,所以我下载了一个1.64.0的库,查下代码,发现真的这个问题已经被修改,
原先会报编译错误的地方被改成了:
#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE2__) || defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2))
#   define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE2_VERSION
#endif
#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE__) || defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1))
#   define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE_VERSION

看来不止我一个人踩坑了,所以写下这个文章,方便大家以后查问题。