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
1 ответ
Ваш код может не иметь pthread_create
в этом, но подумайте на минуту, что на самом деле влечет за собой асинхронная обработка.
Почти наверняка асинхронная функция будет выполняться в отдельном потоке, так что она может работать асинхронно с основным кодом. Это должно быть видно по тому, что ваше сообщение об ошибке содержит текст std::thread
несколько раз.
И в вашей среде кажется, что std::thread
использует нитки под одеялом.
Это действительно не отличается от вашего кода, содержащего cout << someInt
и, возможно, жаловаться на пропавших без вести itoa
-подобная функция для выполнения преобразования целых чисел в строку. Ваша установка, вероятно, была бы серьезно нарушена, если бы она включала потоки, но без стандартных преобразований, но концепция все еще действительна
Исполняемый файл должен иметь доступ ко всем вещам, которые вы явно вызываете, а также ко всем другим зависимостям, которые влекут за собой.
Для чего это стоит, это покрыто (хотя и смутно) в документации GCC (мой акцент):
Когда вы связываете многопоточное приложение, вам, вероятно, потребуется добавить библиотеку или флаг в
g++
, Это очень нестандартная область GCC между портами. Некоторые порты поддерживают специальный флаг (орфография еще даже не стандартизирована) для добавления всех необходимых макросов в компиляцию (если требуются какие-либо такие флаги, вы должны предоставить флаг для всех компиляций, а не только для компоновки) и дополнений библиотеки ссылок и / или замены во время ссылки. Документация слабая.По нескольким целям (включая GNU/Linux, Solaris и различные BSD)
-pthread
это честь