Как заставить CDT/Eclipse работать с потоками С++ 11?

Я попытался проверить пример потоков С++ 11 в Eclipse. Но я получил это сообщение при запуске программы:

завершение вызова после вызова экземпляра 'std:: system_error' what(): операция не разрешена '

Моя система: ubuntu + gcc 4.7

Программа:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "hello from worker" << std::endl;
}

int main(int argc, char **argv)
{
    std::thread t(worker);
    t.join();
}

... и да, я положил -std=c++11 и -pthread внутрь C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags.

Любые комментарии?

Ответ 1

Проблема была решена комментарием Джонатана Вакли.

Я добавил -pthread в C/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags, и программа работала правильно.

Спасибо, Джонатан.

Ответ 2

  • Перейдите в раздел Проект > Свойствa > Общие сведения о C/С++ > Препроцессор включает пути и т.д. > Поставщики > Параметры компилятора CDT GCC и добавьте -std=c++11 в спецификации компилятора.

    Вы также можете сделать это для всех проектов, идущих в Окно > Настройки > C/С++ > Сборкa > Настройки > Обнаружение и добавьте -std=c++11 в настройки CDT GCC Встроенные параметры компиляторасильные > спецификации.

    ${COMMAND} ${FLAGS} -E -P -v -dD -std=c++11 "${INPUTS}"
    
  • Свойства проектa > C/С++ Build > Настройки > Настройки инструментa > Компилятор GCC С++ > Разное > Другие флаги, добавьте -pthread -std=c++11 -Wl,--no-as-needed:

    -c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed
    
  • Свойства проектa > C/С++ Build > Настройки > Настройки инструментa > GCC С++ Linker > Разное > Флаги компоновщика, добавьте -pthread -std=c++11 -Wl,--no-as-needed

    -pthread -std=c++11 -Wl,--no-as-needed
    

Ответ 3

Чтобы работать с С++ 11 std::thread в Eclipse, во время компиляции нужно указать параметр -pthread. Однако , что недостаточно. В моем Ubuntu 14.04, с Eclipse Kepler и g++ 4.9 ниже, он работает:

  • Щелкните правой кнопкой мыши Project и выберите "Свойства"
  • Перейдите в раздел "C/С++ Build" > "Настройки" > (вкладка) "Настройки инструмента"
  • Сначала выберите 'Cross g++ Compiler' > 'Разное' > 'Другие флаги',
    и добавить -pthread после -std=c++11
  • Второй выберите 'Cross g++ Linker' > 'Библиотеки',
    и добавьте pthread (что эквивалентно в командной строке -lpthread)

Наконец, перекомпилируйте проект; ошибка должна идти.

Также помните, что если вы используете, std::thread, то его объект должен быть join() где-то. Кроме того, вы можете получить ниже ошибки времени выполнения:

завершение вызова без активного исключения