
PING!!! Le 08/07/12 20:54, Vicente J. Botet Escriba a écrit :
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