On Thu, Feb 7, 2013 at 7:47 PM, Howard Hinnant <[email protected]> wrote:
> On Feb 7, 2013, at 6:17 AM, Alexey Samsonov <[email protected]> wrote: > > > Hi! > > > > I'm trying to build libcxx on Linux (Ubuntu Precise) using the following > command: > > > > cmake -DLIBCXX_CXX_ABI=libsupc++ > '-DLIBCXX_LIBSUPCXX_INCLUDE_PATHS=/usr/include/c++/4.6;/usr/include/c++/4.6/x86_64-linux-gnu/.;' > -DLIBCXX_ENABLE_EXCEPTIONS=OFF -DLIBCXX_ENABLE_SHARED=OFF > -DLIBCXX_ENABLE_RTTI=OFF -DCMAKE_BUILD_TYPE=Release > -DCMAKE_INSTALL_PREFIX=/tmp/tmp.boBpS5zFqt/libcxx_inst > /tmp/tmp.boBpS5zFqt/libcxx > > > > and I want the result to be "hermetic" in the sense that resulting > static library libc++.a doesn't reference undefined symbols from std:: > > However, I see the following problems: > > > > (libc++.a.new.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/new.cpp:function > std::bad_alloc::~bad_alloc(): error: undefined reference to > 'std::exception::~exception()' > > (libc++.a.new.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/new.cpp:function > std::bad_array_new_length::~bad_array_new_length(): error: undefined > reference to 'std::exception::~exception()' > > (libc++.a.new.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/new.cpp:function > std::bad_array_new_length::~bad_array_new_length(): error: undefined > reference to 'std::exception::~exception()' > > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function > std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush(): > error: undefined reference to 'std::uncaught_exception()' > > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function > std::__1::basic_ostream<wchar_t, std::__1::char_traits<wchar_t> >::flush(): > error: undefined reference to 'std::uncaught_exception()' > > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function > std::__1::basic_ostream<char, std::__1::char_traits<char> > >::sentry::~sentry(): error: undefined reference to > 'std::uncaught_exception()' > > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function > std::__1::basic_ostream<char, std::__1::char_traits<char> > >::sentry::~sentry(): error: undefined reference to > 'std::uncaught_exception()' > > > (libc++.a.memory.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/memory.cpp:function > std::__1::bad_weak_ptr::~bad_weak_ptr(): error: undefined reference to > 'std::exception::~exception()' > > > (libc++.a.memory.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/memory.cpp:function > vtable for std::__1::__shared_weak_count: error: undefined reference to > 'std::__1::__shared_weak_count::__get_deleter(std::type_info const&) const' > > > (libc++.a.thread.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/thread.cpp:function > std::__1::thread::~thread(): error: undefined reference to > 'std::terminate()' > > > > What is the correct way to for that? I have the patch (attached) that > works for me, but I'm not really sure it's correct > > (especially the first part). > > Yeah, we tried this once: > > > --- include/memory (revision 173248) > > +++ include/memory (working copy) > > @@ -3629,10 +3629,9 @@ > > long use_count() const _NOEXCEPT {return > __shared_count::use_count();} > > __shared_weak_count* lock() _NOEXCEPT; > > > > - // purposefully not protected with #ifndef _LIBCPP_NO_RTTI because > doing so > > - // breaks ABI for those clients who need to compile their projects > with > > - // -fno-rtti and yet link against a libc++.dylib compiled > without -fno-rtti. > > +#ifndef _LIBCPP_NO_RTTI > > virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; > > +#endif _LIBCPP_NO_RTTI > > and as the comments indicate, got bitten by it, at least on Apple > platforms. > > Way forward: Perhaps you could #ifdef it a little more in such a way that > it isn't going to trigger except for someone trying to do exactly what you > are doing: Build a static lib on linux with rtti and exceptions off. Or > perhaps slightly more general: Build a static lib with rtti and exceptions > off. > Yes, I can add some #ifdefs here. But I also wonder about the second part of the patch: I have __GLIBCXX__ defined because of commit: r173164 Saleem Abdulrasool: Ensure that __GLIBCXX__ is defined when building with libsupc++. and, as a result, I don't get definitions of terminate(), uncaught_exception(), exception>::~exception() and exception::what() in the resulting libc++ library, yet these functions are referenced from it. -- Alexey Samsonov, MSK
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
