17

此代码是否有效,或者我的编译器是否损坏?

#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,它是来自 macports 的 gcc 4.8。

我要疯了吗?

4

5 回答 5

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_pathshttp://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dynamic_or_shared.html#manual.intro.using.linkage .dynamic其他信息(不特定于 Mac OS X)

于 2013-04-03T17:30:54.937 回答
1

这是一个 MacPorts 错误。MacPorts 上已经有错误报告。你可以在那里关注:

https://trac.macports.org/ticket/38814(主要问题)
https://trac.macports.org/ticket/38833(我的报告,目前标记为#38814的重复)

于 2013-04-19T07:53:47.707 回答
1

您的代码在 Xcode 中编译并运行良好。输出是

测试成功,结果为1

编译器是 Apple LLVM 4.2

因此,我建议你有一个编译器配置问题

于 2013-04-04T11:43:54.217 回答
0

确认:您的代码在这里产生同样的问题:

编译器: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,c++,objc,obj-c++,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 --with-gxx -include-dir=/opt/local/include/gcc48/c++/ --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 ()

所以这似乎是 libstdc++ 中的一些错误。顺便说一句,使用 clang 3.2(自制软件),它编译和运行良好(result is 1)。也许您应该使用 bugzilla 提交错误报告...

于 2013-04-05T23:41:28.490 回答
0

如果您不必使用 GCC,则可以使用最新版本的 Apple 编译器。确保从 Xcode 中安装最新的 Xcode 以及“命令行工具”。

命令行应该是:

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

于 2013-04-26T01:41:18.847 回答