|
Boost : |
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
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk