Как подавить предупреждения boost::thread с помощью gcc?
В моем проекте я недавно решил использовать boost::thread. Мой код прекрасно компилируется под Linux, но под Windows (x86 или x64) я получаю следующие предупреждения с gcc 4.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 ответа
Я только что обнаружил -isystem
опция, позволяющая включить каталог как системный каталог. Из файлов в этих каталогах не выдается никаких предупреждений, поэтому это кажется идеальным для моей задачи.
Кроме того, это имеет аккуратный побочный эффект, чтобы сделать SCons
игнорируйте также эти каталоги в дереве зависимостей. Так как я не ожидаю, что эти библиотеки будут часто меняться, это нормально.
Вам может повезти с диагностической прагмой: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
У меня почти те же предупреждения на 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 и флаг компоновщика -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: предупреждение: разыменование type- наказанный указатель нарушит правила строгого алиасинга C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:53:99: предупреждение: разыменование указателя наказанного типа нарушит правила строгого алиасинга C:\workspace\boost_1_45_0/boost/thread/win32/shared_mutex.hpp:54:52: предупреждение: разыменование перенаправленного указателя типа нарушит правила строгого наложения имен C: \ workspace \ boost_1_45_0 / boost / thread / win32 / shared_mutex.hpp: 54: 52: предупреждение: разыменование указатель с типом наказания нарушит правила строгого наложения
Я не смог получить результирующий код, чтобы он не аварийно завершился, поэтому я не знаю, важны ли эти предупреждения (проверяя, изменяет ли многопоточность мои числовые результаты).