代码之家  ›  专栏  ›  技术社区  ›  ereOn

如何用gcc禁止boost::thread警告?

  •  3
  • ereOn  · 技术社区  · 15 年前

    在我的项目中,我最近决定使用boost::thread。我的代码在Linux下编译得很好,但在Windows(x86或x64)下,GCC4.5会出现以下警告:

    In file included from C:\Boost\include\boost-1_44/boost/thread/shared_mutex.hpp:14:0,
                     from C:\Boost\include\boost-1_44/boost/thread/detail/thread_group.hpp:9,
                     from C:\Boost\include\boost-1_44/boost/thread/thread.hpp:24,
                     from C:\Boost\include\boost-1_44/boost/thread.hpp:13,
                     from include\systools/upnp_control_point.hpp:50,
                     from src\upnp_control_point.cpp:45:
    C:\Boost\include\boost-1_44/boost/thread/win32/shared_mutex.hpp: In member function 'T boost::shared_mutex::interlocked_
    compare_exchange(T*, T, T) [with T = boost::shared_mutex::state_data]':
    C:\Boost\include\boost-1_44/boost/thread/win32/shared_mutex.hpp:110:103:   instantiated from here
    C:\Boost\include\boost-1_44/boost/thread/win32/shared_mutex.hpp:50:99: error: dereferencing type-punned pointer will bre
    ak strict-aliasing rules
    C:\Boost\include\boost-1_44/boost/thread/win32/shared_mutex.hpp:50:99: error: dereferencing type-punned pointer will bre
    ak strict-aliasing rules
    C:\Boost\include\boost-1_44/boost/thread/win32/shared_mutex.hpp:51:52: error: dereferencing type-punned pointer will bre
    ak strict-aliasing rules
    C:\Boost\include\boost-1_44/boost/thread/win32/shared_mutex.hpp:51:52: error: dereferencing type-punned pointer will bre
    ak strict-aliasing rules
    In file included from C:\Boost\include\boost-1_44/boost/algorithm/string/detail/find_format.hpp:18:0,
                     from C:\Boost\include\boost-1_44/boost/algorithm/string/find_format.hpp:23,
                     from C:\Boost\include\boost-1_44/boost/algorithm/string/replace.hpp:22,
                     from C:\Boost\include\boost-1_44/boost/date_time/date_facet.hpp:17,
                     from C:\Boost\include\boost-1_44/boost/date_time/gregorian/gregorian_io.hpp:16,
                     from C:\Boost\include\boost-1_44/boost/date_time/gregorian/gregorian.hpp:31,
                     from C:\Boost\include\boost-1_44/boost/date_time/posix_time/time_formatters.hpp:12,
                     from C:\Boost\include\boost-1_44/boost/date_time/posix_time/posix_time.hpp:24,
                     from include\systools/upnp_device.hpp:51,
                     from include\systools/upnp_control_point.hpp:48,
                     from src\upnp_control_point.cpp:45:
    C:\Boost\include\boost-1_44/boost/algorithm/string/detail/find_format_store.hpp: At global scope:
    C:\Boost\include\boost-1_44/boost/algorithm/string/detail/find_format_store.hpp: In instantiation of 'bool boost::algori
    thm::detail::check_find_result(InputT&, FindResultT&) [with InputT = std::basic_string<char>, FindResultT = boost::itera
    tor_range<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> > >]':
    C:\Boost\include\boost-1_44/boost/algorithm/string/detail/find_format_all.hpp:259:17:   instantiated from 'void boost::a
    lgorithm::detail::find_format_all_impl(InputT&, FinderT, FormatterT, FindResultT) [with InputT = std::basic_string<char>
    , FinderT = boost::algorithm::detail::first_finderF<const char*, boost::algorithm::is_equal>, FormatterT = boost::algori
    thm::detail::const_formatF<boost::iterator_range<const char*> >, FindResultT = boost::iterator_range<__gnu_cxx::__normal
    _iterator<char*, std::basic_string<char> > >]'
    C:\Boost\include\boost-1_44/boost/algorithm/string/find_format.hpp:268:13:   instantiated from 'void boost::algorithm::f
    ind_format_all(SequenceT&, FinderT, FormatterT) [with SequenceT = std::basic_string<char>, FinderT = boost::algorithm::d
    etail::first_finderF<const char*, boost::algorithm::is_equal>, FormatterT = boost::algorithm::detail::const_formatF<boos
    t::iterator_range<const char*> >]'
    C:\Boost\include\boost-1_44/boost/algorithm/string/replace.hpp:654:13:   instantiated from 'void boost::algorithm::repla
    ce_all(SequenceT&, const Range1T&, const Range2T&) [with SequenceT = std::basic_string<char>, Range1T = char [15], Range
    2T = char [1]]'
    C:\Boost\include\boost-1_44/boost/units/detail/utility.hpp:50:51:   instantiated from here
    C:\Boost\include\boost-1_44/boost/algorithm/string/detail/find_format_store.hpp:74:18: error: unused parameter 'Input'
    scons: *** [src\upnp_control_point.o] Error 1
    scons: building terminated because of errors.
    

    我只是包括在内 <boost/thread.hpp> 我自己 .cpp 文件,没什么特别的。

    由于我无法控制Boost的代码,有没有办法暂时抑制这些警告?类似:

    #super_killing_macro_that_disable_some_warnings
    #include <boost/thread.hpp>
    #its_all_good_know_i_want_my_warnings_back
    

    我能做什么?

    3 回复  |  直到 15 年前
        1
  •  6
  •   ereOn    15 年前

    我刚发现 -isystem 允许将目录包含为系统目录的选项。这些目录中的文件不会发出任何警告,因此它似乎非常适合我的任务。

    而且,这也会产生整齐的副作用 SCons 忽略依赖树中的那些目录。因为我不希望那些图书馆经常改变,所以没关系。

        2
  •  1
  •   Anycorn    15 年前

    您可能对诊断pragma有一些运气: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

        3
  •  1
  •   Chris Chiasson    15 年前

    我在Windows XP SP3上收到了几乎相同的警告,mingw安装在mingw-get-inst-20101030上,gcc为4.5.0,boost为1.45.0,按此处所示构建。

    http://fw-geekycoder.blogspot.com/2010/12/building-boost-using-mingw.html

    我正在使用boost_thread_use_lib compiler标志和-lboost_thread-mgw45-mt-1_45链接器标志。在这篇文章的最后,我得到的四个警告如下。

    C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:113:103:从此处实例化 C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:53:99:警告:取消引用类型punned指针将破坏严格的别名规则 C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:53:99:警告:取消引用类型punned指针将打破严格的别名规则 C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:54:52:警告:取消引用类型punned指针将打破严格的别名规则 C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:54:52:警告:取消引用类型punned指针将打破严格的别名规则

    我还不能让结果代码不崩溃,所以我不知道这些警告是否重要(通过检查线程是否会更改我的数值结果)。