2

以下代码需要 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

4

1 回答 1

4

您的代码中可能没有pthread_create,但请想一想异步处理实际上需要什么。

几乎可以肯定,异步函数将在单独的线程中运行,这样它就可以与主代码异步运行。std::thread您的错误消息多次包含该文本这一事实应该很明显。

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

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

可执行文件必须有权访问您显式调用的所有内容,以及所需的所有其他依赖项。


对于它的价值,gcc 文档(我的重点)涵盖了(尽管含糊不清):

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

在几个目标(包括 GNU/Linux、Solaris 和各种 BSD)-pthread上受到尊重。

于 2018-02-18T00:26:18.110 回答