2010-09-20 39 views
3

Dans mon projet, j'ai récemment décidé d'utiliser boost :: thread. Mon code compile bien sous Linux, mais sous Windows (x86 ou x64), je reçois les avertissements suivants avec gcc 4.5:Comment supprimer les avertissements boost :: thread avec gcc?

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. 

Je viens inclus <boost/thread.hpp> dans mon propre fichier .cpp, rien de spécial.

Puisque je n'ai aucun contrôle sur le code de boost, existe-t-il un moyen de supprimer temporairement ces avertissements? Quelque chose comme:

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

Que puis-je faire?

+0

vous avez '-Werror' dans la ligne de commande, pouvez-vous l'enlever? – Anycorn

+4

@aaa carpe: Je voudrais le garder. Je veux que mon code soit 100% d'avertissement/sans erreur. Bien sûr, je n'ai aucun contrôle sur le code source des autres bibliothèques, dans ce cas, ignorer est correct. – ereOn

+0

duplication possible de [Comment supprimer les avertissements GCC des en-têtes de bibliothèque?] (Http://stackoverflow.com/questions/1867065/how-to-suppress-gcc-warnings-from-library-headers) – dmckee

Répondre

6

Je viens de découvrir l'option -isystem qui permettent d'inclure un répertoire en tant que répertoire système. Aucun avertissement n'est émis à partir de fichiers dans ces répertoires, donc il semble parfait pour ma tâche.

En outre, cela a l'effet secondaire de faire SCons ignorer également ces répertoires dans l'arbre de dépendance. Comme je ne m'attends pas à ce que ces bibliothèques changent souvent, ça va.

+1

Tout ce qu'il fait est d'arrêter les avertissements, le code viole encore les règles strictes d'aliasing et peut être mal compilé. Utilisez '-fno-strict-aliasing' pour dire au compilateur de ne pas effectuer d'optimisations basées sur le code suivant les règles. –

1

vous pouvez avoir un peu de chance avec pragma diagnostic: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

+0

Merci. Mais je ne sais pas quels drapeaux désactiver. Comment puis-je savoir ? – ereOn

+0

@ereOn pour les débutants, essayez drapeaux '-Werror' et alias strictes, je ne me souviens pas de l'option exacte. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html – Anycorn

+0

L'avertissement vient de '-Wstrict-aliasing' (qui, comme le dit Anycorn, se trouve en lisant le manuel, bien sûr).Si vous compilez avec '-fno-strict-aliasing' le compilateur ne va pas mal compiler le code même s'il viole les règles strictes d'aliasing, et l'avertissement sera également supprimé. –

1

J'ai presque les mêmes avertissements sur Windows XP SP3 avec MinGW installés à partir MinGW-get-inst-20101030 avec GCC 4.5.0 et 1.45.0 boost intégré comme indiqué ici

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

I utilise l'indicateur de compilation BOOST_THREAD_USE_LIB et l'indicateur de liaison -lboost_thread-mgw45-mt-1_45. Les quatre seuls avertissements que je reçois sont les suivants à la fin de ce post.

C: \ espace de travail \ boost_1_45_0/accentuation/fil/Win32/shared_mutex.hpp: 113: 103: instancié à partir d'ici C: \ espace de travail \ boost_1_45_0/accentuation/fil/Win32/shared_mutex.hpp: 53: 99: warning: dereferencing type-punned pointer va casser les règles de strict-aliasing C: \ workspace \ boost_1_45_0/boost/thread/win32/shared_mutex.hpp: 53: 99: avertissement: le déréférencier pointeur puni par type va casser les règles de strict-aliasing C : \ workspace \ boost_1_45_0/boost/thread/win32/shared_mutex.hpp: 54: 52: avertissement: le pointeur déréférencé par type punira les règles strict-aliasing C: \ workspace \ boost_1_45_0/boost/thread/win32/shared_mutex.hpp : 54: 52: avertissement: le pointeur déréférencé par type punira les règles d'alias strictes

Je n'ai pas pu obtenir le code résultant pour ne pas encore planter, donc je ne sais pas si ces avertissements sont importants ou pas (en vérifiant si le thread change mes résultats numériques).