Подтвердить что ты не робот

Является ли std:: prom сломанным на моей машине (с использованием g++ - mp)?

Является ли этот код действительным или мой компилятор сломан?

#include <future>
#include <iostream>

int main() {
   std::cout << "doing the test" << std::endl;
   std::promise<bool> mypromise;
   std::future<bool> myfuture = mypromise.get_future();
   mypromise.set_value(true);
   bool result = myfuture.get();
   std::cout << "success, result is " << result << std::endl;
   return 0;
}

Здесь вывод:

$ g++-mp-4.8 -std=c++11 test.cpp
$ ./a.out
doing the test
Segmentation fault: 11
$ 

Я использую g++ - mp-4.8, который является gcc 4.8 из macports.

Я сойду с ума?

4b9b3361

Ответ 1

Динамический компоновщик может связывать вашу программу со старой версией libstdc++, которая находится в /opt/local/lib/libstdc++.6.dylib

Поскольку вы компилируете GCC 4.8, вам нужно использовать новый libstdc++, который поставляется с GCC 4.8, что, вероятно, /opt/local/lib/gcc48/libstdc++.6.dylib

Вы должны проверить, является ли /opt/local/lib/libstdc++.6.dylib библиотека, которая поставляется вместе с GCC 4.8, и использовать ее правильно, если это не так.

Вы можете управлять этим по-разному, простейшим (но не обязательно лучшим) будет работать:

export DYLD_LIBRARY_PATH=/opt/local/lib/gcc48/
./a.out

См. http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths и http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dynamic_or_shared.html#manual.intro.using.linkage.dynamic для другая информация (которая не относится к Mac OS X)

Ответ 2

Ваш код компилируется и работает отлично для меня в Xcode. Выходной сигнал

выполнение теста успех, результат 1

Компилятор - это Apple LLVM 4.2

Таким образом, я предлагаю вам проблему с конфигурацией компилятора

Ответ 3

Это ошибка MacPorts. На MacPorts уже есть сообщения об ошибках. Вы можете следить за ним:

https://trac.macports.org/ticket/38814 (основная проблема)
https://trac.macports.org/ticket/38833 (мой отчет, в настоящее время отмеченный как дубликат # 38814)

Ответ 4

подтверждено: ваш код создает такую ​​же проблему:

компилятор: g++ -v дает

 Using built-in specs.
 COLLECT_GCC=/opt/local/bin/g++-mp-4.8
 COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin12/4.8.1/lto-wrapper
 Target: x86_64-apple-darwin12

Настроено с помощью:../gcc-4.8-20130328/configure --prefix =/opt/local --build = x86_64-apple-darwin12 --enable-languages ​​= c, С++, objc, obj-С++, fortran, java --libdir =/opt/local/lib/gcc48 --includedir =/opt/local/include/gcc48 --infodir =/opt/local/share/info --mandir =/opt/local/share/man --datarootdir =/opt/local/share/gcc-4.8 --with-local-prefix =/opt/local --with-system-zlib --disable-nls --program-suffix = -mp-4.8 - с-gxx-include-dir =/opt/local/include/gcc48/С++/--with-gmp =/opt/local --with-mpfr =/opt/local --with-mpc =/opt/local - -with-ppl =/opt/local --with-cloog =/opt/local --enable-cloog-backend = isl --disable-cloog-version-check -enable-stage1-checking --disable-multilib - -enable-lto --enable-libstdcxx-time --with-as =/opt/local/bin/as --with-ld =/opt/local/bin/ld --with-ar =/opt/local/bin/ar --with-bugurl = https://trac.macports.org/newticket --with-pkgversion = 'MacPorts gcc48 4.8-20130328_0'

 Thread model: posix
 gcc version 4.8.1 20130328 (prerelease) (MacPorts gcc48 4.8-20130328_0)

запуск в gdb дает:

doing the test

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
0x0000000100081c30 in __once_proxy ()
(gdb) up
#1  0x00007fff8872fff0 in pthread_once ()
(gdb) up
#2  0x0000000100000fd2 in __gthread_once ()
(gdb) up
#3  0x00000001000020c9 in _ZSt9call_onceIMNSt13__future_base11_State_baseEFvRSt8functionIFSt10unique_ptrINS0_12_Result_baseENS4_8_DeleterEEvEERbEIKPS1_St17reference_wrapperIS8_ESF_IbEEEvRSt9once_flagOT_DpOT0_ ()
(gdb) up
#4  0x0000000100001886 in std::__future_base::_State_base::_M_set_result ()
(gdb) up
#5  0x00000001000025ef in std::promise<bool>::set_value ()
(gdb) up
#6  0x000000010000119f in main ()

так что это похоже на ошибку в libstdС++. Btw, используя clang 3.2 (homebrew), он компилируется и работает отлично (result is 1). Возможно, вам следует отправить отчет об ошибке с помощью bugzilla...

Ответ 5

Если вам не нужно использовать GCC, работает последняя версия компилятора Apple. Убедитесь, что вы установили последний Xcode, а также "инструменты командной строки" из Xcode.

Командная строка должна быть:

clang++ -std=c++11 -stdlib=libc++ -pthread test.cpp