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

11

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

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

Моя система: Ubuntu + GCC 4,7

Program:

#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.

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

Кажется странным помещать эти настройки в раздел «кросс-компилятор» (но я не знаю Eclipse). Сбой повторяется, если-pthreadлаг @ отсутствует в командной строке, и у вас установлены другие версии libstdc ++. Поэтому убедитесь, что флаг действительно передается вашему компилятор Mat
@ Klaim: эта ошибка появляется, если вы ссылаетесь на неправильный libstdc ++, что может произойти, если у вас установлено несколько версий и вы не передаете-pthread (или ваша установка GCC не выполняется) Mat
Это исключение времени выполнения, поэтому код компилируется правильно. Тем не менее, я не понимаю, в каких случаях должно появляться это сообщение об исключении ... Klaim
Эта ошибка определенно случается, когда-pthread не используется (даже если у вас установлен только один libstdc ++). Удостовериться-pthread используется для команды компилятораа такж команда компоновщика. В противном случае libpthread.so не будет связан и потоки не могут быть запущены во время выполнения. Jonathan Wakely
Я думаю-pthread передается компилятору, потому что я положил его в то же место, что и-std=c++11, и код не будет скомпилирован, когда я не поставил-std=c++11. Еще более странно то, что код работает правильно, когда я компилирую его из командной строки вручную. melmi

Ваш Ответ

3   ответа
10

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

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

Для меня это было... -> CCC C++ Linker -> Miscellaneous -> Linker flags gsamaras
hmm, это заставляет мою программу запускаться и отлаживать okey в eclipse, но проверка синтаксиса все равно выдает мне ошибки, когда я использую std :: thread или thread.join. Кто-нибудь знает, как это решить? kaefert
1

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

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

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

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

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

1

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

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

${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 ++ Linker> Разное> Флажки линкера, Добавлять-pthread -std=c++11 -Wl,--no-as-needed

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

Похожие вопросы