Crosstool-ng g++ не компилируется C++11 std::current_exception

Я создаю набор инструментов gcc с использованием Crosstool-ng, но полученный g++ не компилирует и / или не связывает исключения C++11.

Если я попытаюсь скомпилировать:

#include <exception>

int main()
{
    std::current_exception();
}

с помощью:

arm-none-linux-gnueabihf-g++ -std=c++11 foo.cpp

Я получил:

foo.cpp: In function 'int main()':
foo.cpp:5:9: error: 'current_exception' is not a member of 'std'
         std::current_exception();
         ^~~

Однако, если я дополнительно предоставлю cortex-a9 в качестве процессора, поведение изменится:

arm-none-linux-gnueabihf-g++ -mcpu=cortex-a9 -std=c++11 foo.cpp

результаты в:

/tmp/cc13AEjE.o: In function `main':
foo.cpp:(.text+0x14): undefined reference to `std::current_exception()'
foo.cpp:(.text+0x20): undefined reference to 
`std::__exception_ptr::exception_ptr::~exception_ptr()'
collect2: error: ld returned 1 exit status

Я нашел внутри цепочку инструментов для current_exception, и мне кажется, что это хорошо:

grep -r -e current_exception arm-none-linux-gnueabihf/


Binary file arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/sysroot/lib/libstdc++.so.6.0.22 matches
Binary file arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/sysroot/lib/libstdc++.a matches
Binary file arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/sysroot/lib/libsupc++.a matches
arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include/c++/6.3.0/cxxabi.h:  __cxa_current_exception_type() _GLIBCXX_NOTHROW __attribute__ ((__pure__));
arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include/c++/6.3.0/future:     (*_M_result)->_M_error = current_exception();
arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include/c++/6.3.0/future:     (*_M_result)->_M_error = current_exception();
arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include/c++/6.3.0/bits/exception_ptr.h:  exception_ptr current_exception() _GLIBCXX_USE_NOEXCEPT;
arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include/c++/6.3.0/bits/exception_ptr.h:      friend exception_ptr std::current_exception() _GLIBCXX_USE_NOEXCEPT;
arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/include/c++/6.3.0/bits/exception_ptr.h:     return current_exception();
arm-none-linux-gnueabihf/arm-none-linux-    gnueabihf/include/c++/6.3.0/bits/nested_exception.h:    nested_exception()     noexcept : _M_ptr(current_exception()) { }

Настройки, которые я использовал для Crosstool-ng:

arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++ -v

Using built-in specs.
COLLECT_GCC=x-tools/arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++
COLLECT_LTO_WRAPPER=/home/builduser/x-tools/arm-none-linux-gnueabihf/libexec/gcc/arm-none-linux-gnueabihf/6.3.0/lto-wrapper
Target: arm-none-linux-gnueabihf
Configured with: /home/builduser/build/.build/src/gcc-6.3.0/configure 
--build=x86_64-build_pc-linux-gnu 
--host=x86_64-build_pc-linux-gnu 
--target=arm-none-linux-gnueabihf 
--prefix=/home/builduser/x-tools/arm-none-linux-gnueabihf 
--with-sysroot=/home/builduser/x-tools/arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/sysroot 
--enable-languages=c,c++ 
--with-float=hard 
--with-pkgversion='crosstool-NG crosstool-ng-1.23.0' 
--disable-sjlj-exceptions 
--enable-__cxa_atexit 
--disable-libmudflap 
--disable-libgomp 
--disable-libssp 
--disable-libquadmath 
--disable-libquadmath-support 
--disable-libsanitizer 
--disable-libmpx 
--with-gmp=/home/builduser/build/.build/arm-none-linux-gnueabihf/buildtools 
--with-mpfr=/home/builduser/build/.build/arm-none-linux-gnueabihf/buildtools 
--with-mpc=/home/builduser/build/.build/arm-none-linux-gnueabihf/buildtools 
--with-isl=/home/builduser/build/.build/arm-none-linux-gnueabihf/buildtools 
--disable-lto 
--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++ -lm' 
--enable-threads=posix 
--enable-target-optspace 
--disable-plugin 
--disable-nls 
--disable-multilib 
--with-local-prefix=/home/builduser/x-tools/arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/sysroot 
--enable-long-long
Thread model: posix
gcc version 6.3.0 (crosstool-NG crosstool-ng-1.23.0) 

Сборка примера std::array работает нормально.

РЕДАКТИРОВАТЬ:

Если я включу CT_ARCH_CPU="cortex-a9" вариант моей конфигурации crostool-NG (что приводит к --with-cpu=cortex-a9 в g++) пример std::current_exception работает нормально.

Итак, вопрос:

Почему вариант cpu, для которого компилятор должен генерировать код, и способ передачи варианта cpu в цепочку инструментов (-mcpu во время выполнения против встроенного --with-cpu) влияет на способность компилировать / ссылаться на std::current_exception?

0 ответов

Другие вопросы по тегам