$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: [boost] [thread][chrono][system] fails to compile with -fno-exceptions
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2012-07-08 14:54:00
Hi,
I'm trying to make Boost.Thread work when -fno-exceptions is defined and
I getting a lot of errors on Boost.System
cd libs/system/build
bjam toolset=darwin-4.7.0 -j4 cxxflags="-fno-exceptions"
define=BOOST_NO_EXCEPTION
darwin.compile.c++
../../../bin.v2/libs/system/build/darwin-4.7.0/debug/error_code.o
../../../libs/system/src/error_code.cpp: In member function virtual
std::string {anonymous}::generic_error_category::message(int) const:
../../../libs/system/src/error_code.cpp:149:10: error: expected catch
before ( token
../../../libs/system/src/error_code.cpp:149:12: error: expected
type-specifier before sz
../../../libs/system/src/error_code.cpp:149:12: error: exception
handling disabled, use -fexceptions to enable
../../../libs/system/src/error_code.cpp:149:15: error: expected )
before > token
../../../libs/system/src/error_code.cpp:149:15: error: expected {
before > token
../../../libs/system/src/error_code.cpp:149:15: error: expected
primary-expression before > token
../../../libs/system/src/error_code.cpp:149:29: error: expected ;
before ) token
In file included from ../../../libs/system/src/error_code.cpp:19:0:
../../../boost/system/error_code.hpp: At global scope:
../../../boost/system/error_code.hpp:214:36: warning:
boost::system::posix_category defined but not used [-Wunused-variable]
../../../boost/system/error_code.hpp:215:36: warning:
boost::system::errno_ecat defined but not used [-Wunused-variable]
../../../boost/system/error_code.hpp:216:36: warning:
boost::system::native_ecat defined but not used [-Wunused-variable]
"/usr/local/gcc-4-7-svn/bin/g++" -ftemplate-depth-128 -O0 -fno-inline
-Wall -g -dynamic -gdwarf-2 -fexceptions -fPIC -fno-exceptions
-DBOOST_ALL_NO_LIB=1 -DBOOST_NO_EXCEPTION -DBOOST_SYSTEM_DYN_LINK=1
-I"../../.." -c -o
"../../../bin.v2/libs/system/build/darwin-4.7.0/debug/error_code.o"
"../../../libs/system/src/error_code.cpp"
...failed darwin.compile.c++
../../../bin.v2/libs/system/build/darwin-4.7.0/debug/error_code.o...
...skipped
<p../../../bin.v2/libs/system/build/darwin-4.7.0/debug>libboost_system.dylib
for lack of
<p../../../bin.v2/libs/system/build/darwin-4.7.0/debug>error_code.o...
...failed updating 1 target...
After applying this patch the library builds
Index: ../../../libs/system/src/error_code.cpp
===================================================================
--- ../../../libs/system/src/error_code.cpp (revision 79245)
+++ ../../../libs/system/src/error_code.cpp (working copy)
@@ -133,7 +133,9 @@
}
}
std::string msg;
+# ifndef BOOST_NO_EXCEPTIONS
try
+# endif
{
msg = ( ( result == invalid_argument ) ? "Unknown error" : bp );
}
cd libs/chrono/build
bjam toolset=darwin-4.7.0 -j4 cxxflags="-fno-exceptions"
define=BOOST_NO_EXCEPTION
darwin.compile.c++
../../../bin.v2/libs/chrono/build/darwin-4.7.0/debug/threading-multi/process_cpu_clocks.o
In file included from
../../../boost/chrono/detail/inlined/process_cpu_clocks.hpp:21:0,
from ../../../libs/chrono/src/process_cpu_clocks.cpp:17:
../../../boost/system/system_error.hpp: In member function virtual
const char* boost::system::system_error::what() const:
../../../boost/system/system_error.hpp:73:16: error: exception handling
disabled, use -fexceptions to enable
After applying this patch
Index: ../../../boost/system/system_error.hpp
===================================================================
--- ../../../boost/system/system_error.hpp (revision 79245)
+++ ../../../boost/system/system_error.hpp (working copy)
@@ -21,7 +21,7 @@
class BOOST_SYMBOL_VISIBLE system_error : public std::runtime_error
// BOOST_SYMBOL_VISIBLE is needed by GCC to ensure system_error thrown
from a shared
- // library can be caught. See svn.boost.org/trac/boost/ticket/3697
+ // library can be caught. See svn.boost.org/trac/boost/ticket/3697
{
public:
system_error( error_code ec )
@@ -61,13 +61,17 @@
{
if ( m_what.empty() )
{
+#ifndef BOOST_NO_EXCEPTIONS
try
+#endif
{
m_what = this->std::runtime_error::what();
if ( !m_what.empty() ) m_what += ": ";
m_what += m_error_code.message();
}
+#ifndef BOOST_NO_EXCEPTIONS
catch (...) { return std::runtime_error::what(); }
+#endif
}
return m_what.c_str();
}
I get
darwin.link.dll
../../../bin.v2/libs/chrono/build/darwin-4.7.0/debug/threading-multi/libboost_chrono.dylib
Undefined symbols for architecture x86_64:
"boost::throw_exception(std::exception const&)", referenced from:
boost::chrono::chrono_detail::steady_full_ec(boost::system::error_code&)
in chrono.o
boost::chrono::steady_clock::now(boost::system::error_code&) in chrono.o
boost::chrono::process_real_cpu_clock::now(boost::system::error_code&)
in process_cpu_clocks.o
boost::chrono::process_user_cpu_clock::now(boost::system::error_code&)
in process_cpu_clocks.o
boost::chrono::process_system_cpu_clock::now(boost::system::error_code&)
in process_cpu_clocks.o
boost::chrono::process_cpu_clock::now(boost::system::error_code&) in
process_cpu_clocks.o
Does this mean that the user needs to link with a static library?
Is there a way to provide a dynamic library for Boost.Chrono if it is up
to the user to define boost::throw_exception?
Is there a possibility that Boost.System support this mode? BTW, an
alternative to redefine the the what function is to pass the string at
the construction of the exception.
Best,
Vicente