std :: async с gcc 7.2 нужна опция ссылки pthread

В следующем коде нужна опция pthread link для компиляции, и я не понимаю почему. Есть ли у вас какие-либо идеи?

Я использую 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

0

Решение

Ваш код может не иметь pthread_create в этом, но подумайте на минуту, что на самом деле влечет за собой асинхронная обработка.

Почти наверняка асинхронная функция будет выполняться в отдельном потоке, так что она может работать асинхронно с основным кодом. Это должно быть видно по тому, что ваше сообщение об ошибке содержит текст std::thread несколько раз.

И в вашей среде кажется, что std::thread использует нитки под одеялом.

Это действительно не отличается от вашего кода, содержащего cout << someInt и, возможно, жаловаться на пропавших без вести itoa-подобная функция для выполнения преобразования целых чисел в строку. Ваша установка, вероятно, будет серьезно повреждена, если она будет включать потоки, но не будет стандартных преобразований, кроме концепция все еще в силе.

Исполняемый файл должен иметь доступ ко всем вещам, которые вы явно вызываете, плюс все другие зависимости, которые влечет за собой.


Для чего это стоит, это является покрыты (хотя и смутно) в GCC документы (мой акцент):

Когда вы связываете многопоточное приложение, вам, вероятно, потребуется добавить библиотеку или флаг в g++, Это очень нестандартная область GCC между портами. Некоторые порты поддерживают специальный флаг (орфография еще даже не стандартизирована) для добавления всех необходимых макросов в компиляцию (если требуются какие-либо такие флаги, вы должны предоставить флаг для всех компиляций, а не только для компоновки) и дополнений библиотеки ссылок и / или замены во время ссылки. Документация слабая.

По нескольким целям (включая GNU / Linux, Solaris и различные BSD) -pthread это честь

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]