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


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

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

Моя система: 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.

Какие-нибудь комментарии?

3 11

3 ответа:

Проблема была решена с помощью комментарий Джонатана Уэйкли.

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

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

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

  1. щелкните правой кнопкой мыши на проекте и выберите "Свойства"
  2. К 'С/C++ построить - > Настройки' > (вкладка) 'параметры'
  3. Сначала выберите 'Cross G++ Compiler' > 'разное' > 'другие флаги';
    и добавить -pthread после -std=c++11
  4. Второй выбор 'Cross G++ Linker' > "Библиотеки";
    и добавьте pthread (что эквивалентно в командную строку -lpthread)

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

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

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

  1. Перейдите в раздел Project > Properties > C/C++ General > Preprocessor include paths, etc > Providers > CDT GCC Builtin Compiler Settings и добавьте -std=c++11 к спецификациям компилятора.

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

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

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

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