Как заставить 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 ответа:
Проблема была решена с помощью комментарий Джонатана Уэйкли.
Я добавил
-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 ниже это работает:
- щелкните правой кнопкой мыши на проекте и выберите "Свойства"
- К 'С/C++ построить - > Настройки' > (вкладка) 'параметры'
- Сначала выберите 'Cross G++ Compiler' > 'разное' > 'другие флаги';
и добавить-pthread
после-std=c++11
- Второй выбор 'Cross G++ Linker' > "Библиотеки";
и добавьтеpthread
(что эквивалентно в командную строку-lpthread
)Наконец-то повторно скомпилируйте проект; ошибка должна уйти.
Также помните, что если вы используете,
std::thread
, то его объект должен бытьjoin()
где-то. Иначе вы можете получить ниже ошибки во время выполнения:Завершение вызывается без активного исключения
Перейдите в раздел 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}"
Свойства Проекта > Сборка C / C++ > Настройки > Инструмент Настройки > компилятор GCC C++ > разное > другие флаги , добавить
-pthread -std=c++11 -Wl,--no-as-needed
:-c -fmessage-length=0 -pthread -std=c++11 -Wl,--no-as-needed
Свойства проекта > сборка C/C++ > Настройки > настройки инструмента > Компоновщик GCC C++ > разное > флаги компоновщика , добавить
-pthread -std=c++11 -Wl,--no-as-needed
-pthread -std=c++11 -Wl,--no-as-needed