2010-09-20 65 views
3

在我的项目中,我最近决定使用boost :: thread。我的代码编译Linux下的罚款,但Windows(x86或x64)下,我得到的gcc 4.5以下警告:如何使用gcc抑制boost :: thread警告?

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. 

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

因为我无法控制boost的代码,有没有办法来暂时禁止这些警告?例如:

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

我该怎么办?

+0

你在命令行中有'-Werror',你能把它拿出来吗? – Anycorn 2010-09-20 07:14:28

+4

@aaa鲤鱼:我想保留它。我希望我的代码100%免费警告/错误。当然,我无法控制其他库源代码,所以在这种情况下,忽略是好的。 – ereOn 2010-09-20 07:16:00

+0

[如何从库头压缩GCC警告?](http://stackoverflow.com/questions/1867065/how-to-suppress-gcc-warnings-from-library-headers) – dmckee 2011-11-16 18:45:52

回答

6

我刚刚发现-isystem选项,允许包括目录为系统目录。目录中没有任何警告,因此它对我的任务似乎很完美。

此外,这具有使SCons忽略那些在依赖关系树中的目录的副作用。由于我不期望这些库经常改变,所以没关系。

+1

所做的只是停止警告,代码仍然违反了严格的别名规则,可能会被错误编译。使用'-fno-strict-aliasing'来告诉编译器不要执行依赖规则后面代码的优化。 – 2012-05-06 15:20:49

1

你可能有一些运气诊断附注: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

+0

谢谢。但我不知道要关闭哪些标志。我怎么知道 ? – ereOn 2010-09-20 07:28:37

+0

@ereOn首先,尝试'-Werror'和严格的别名标志,我不记得确切的选项。 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html – Anycorn 2010-09-20 07:31:22

+0

警告来自'-Wstrict-aliasing'(正如Anycorn所说,当然你可以通过阅读手册找到)。如果使用'-fno-strict-aliasing'进行编译,即使编译器违反严格的别名规则,编译器也不会错误编译代码,并且警告也会被抑制。 – 2012-05-06 15:16:25

1

我有在mingw-GET-INST-20101030安装了GCC 4.5.0在Windows XP SP3几乎是相同的警告与MinGW和促进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:\工作空间\ boost_1_45_0 /升压/线程/的Win32/shared_mutex.hpp:113:103:从这里实例 C:\工作空间\ boost_1_45_0 /升压/线程/的Win32/shared_mutex.hpp:53:99:警告:解引用类型指针会破坏严格别名规则 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:warning:取消引用类型化指针将打破严格别名规则 C:\ workspace \ boost_1_45_0/boost/thread/win32/shared_mutex.hpp :54:52:warning:解引用类型指针会打破严格别名规则

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