std :: async与gcc 7.2需要pthread链接选项

时间:2018-02-18 00:21:20

标签: c++ c++11 gcc stdasync gcc7

以下代码需要pthread链接选项进行编译,我不明白为什么。你有什么想法吗?

我正在使用gcc 7.2.0

#include <future>

int sum = 0;

void func()
{
   for(int i=0; i < 10; ++i)
      sum +=i;
}

int main()
{
    std::future<void> f =  std::async(std::launch::async, func);
    return 0;
}

使用

进行编译
g++ -o test test.cpp

提供以下错误

/tmp/ccoEkyeZ.o: dans la fonction « std::thread::thread<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::{lambda()#1}&&) »:
test.cpp:(.text._ZNSt6threadC2IZNSt13__future_base17_Async_state_implINS_8_InvokerISt5tupleIJPFvvEEEEEvEC4EOS8_EUlvE_JEEEOT_DpOT0_[_ZNSt6threadC5IZNSt13__future_base17_Async_state_implINS_8_InvokerISt5tupleIJPFvvEEEEEvEC4EOS8_EUlvE_JEEEOT_DpOT0_]+0x30): référence indéfinie vers « pthread_create »
collect2: error: ld returned 1 exit status

使用

g++ -o test test.cpp -lpthread

没有问题。

这是正常的吗?我错过了什么吗?我的代码在某处没有pthread_create

1 个答案:

答案 0 :(得分:3)

您的代码中可能没有pthread_create,但只想一下异步处理实际需要的内容。

几乎可以确定异步函数将在一个单独的线程中运行,以便它可以与主代码异步运行。这应该是因为您的错误消息多次包含文本std::thread这一事实。

而且,在您的环境中,似乎std::thread使用了pthreads。

这与包含cout << someInt的代码没有什么不同,它可能会抱怨缺少itoa - 类似于执行整数到字符串转换的函数。如果包含流但没有标准转换,但概念仍然有效,您的设置可能会严重损坏。

可执行文件必须能够访问您明确调用的所有内容, plus 所有其他依赖项。

对于它的价值,这个 gcc docs(我的重点)中被覆盖(尽管含糊不清):

  

链接多线程应用程序时,可能需要向g++添加库或标志。这是跨港口GCC非常标准化的区域。有些端口支持一个特殊标志(拼写甚至没有标准化),以便将所有必需的宏添加到编译中(如果需要任何此类标志,则必须为所有编译提供标志,而不仅仅是链接)和链接库链接时的添加和/或替换。文档很薄弱。

     

在几个目标(包括GNU / Linux,Solaris和各种BSD)上-pthread很荣幸。