std :: promise在我的机器上坏了(使用g ++ - mp)吗?

Ver*_*gon 17 c++ gcc future c++11

这段代码有效,还是我的编译器坏了?

#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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ g++-mp-4.8 -std=c++11 test.cpp
$ ./a.out
doing the test
Segmentation fault: 11
$ 
Run Code Online (Sandbox Code Playgroud)

我正在使用g ++ - mp-4.8,这是来自macports的gcc 4.8.

我疯了吗?

Jon*_*ely 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
Run Code Online (Sandbox Code Playgroud)

请参阅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)