Как включить поддержку C++11/C++0x в Eclipse CDT?

Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2

Это пример фрагмента кода C++11:

auto text = std::unique_ptr<char[]>(new char[len]);

Редактор Eclipse жалуется на:

Function 'unique_ptr' could not be resolved

Компиляция Makefile работает отлично. Как заставить Eclipse перестать жаловаться на подобные ошибки?

15 ответов

Решение

Я нашел эту статью на форуме Eclipse, просто выполнил эти шаги, и она работает для меня. Я использую Eclipse Indigo 20110615-0604 на Windows с установкой Cygwin.

  • Создайте новый проект C++
  • Параметры по умолчанию для всего
  • После создания щелкните правой кнопкой мыши проект и перейдите в "Свойства"
  • Сборка C/C++ -> Настройки -> Настройки инструмента -> Компилятор GCC C++ -> Разное -> Другие флаги. Положил -std=c++0x (или для более новой версии компилятора -std=c++11 в конце.... вместо компилятора GCC C++ у меня также есть компилятор Cygwin
  • C/C++ Общее -> Пути и символы -> Символы -> GNU C++. Нажмите "Добавить..." и вставьте __GXX_EXPERIMENTAL_CXX0X__ (убедитесь, что добавили и добавили два подчеркивания) в поле "Имя" и оставьте "Значение" пустым.
  • Нажмите "Применить", сделайте все, что от вас требуется, затем нажмите "ОК".

Описание этого также есть в Eclipse FAQ: Eclipse FAQ / C++ 11 Особенности.

Настройка изображения Eclipse

Инструкция для Eclipse CDT 4.4 Luna и 4.5 Mars

Сначала, перед созданием проекта, настройте синтаксический анализатор Eclipse:

Window -> Preferences -> C/C++ -> Build -> Settings -> Discovery -> CDT GCC Build-in Compiler Settings

в текстовом поле, озаглавленном Command to get compiler specs присоединять -std=c++11

Теперь вы можете создать проект, конфигурация которого зависит от того, какой проект вы создали:

Для проекта, созданного как: Файл -> Новый -> Проект -> C/C++ -> Проект C++

Щелкните правой кнопкой мыши по созданному проекту и откройте

Properties -> C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Dialect

Положил -std=c++11 в текстовое поле под названием other dialect flags или выберите ISO C++11 от Language standard падать.

Для проекта CMake

Генерация файлов проекта затмения (внутри вашего проекта)

mkdir build
cd build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ..

Затем импортируйте созданный каталог в eclipse как стандартный проект eclipse. Щелкните правой кнопкой мыши проект и откройте

Properties -> C/C++ General -> Preprocessor Include Paths, Marcos etc. -> Providers

включить CDT GCC Build-in Compiler Settings и переместить его выше, чем Contributed PathEntry Containers (Это важно)

Последний общий шаг

перекомпилировать, восстановить Project ->C/C++ Index и перезапустите Eclipse.

Обновление 2016:

Начиная с gcc 6 ( изменения), диалект C++ по умолчанию - C++14. Это означает, что если вам явно не нужен более новый или более старый диалект, чем чем-либо, вам больше не нужно ничего делать с затмением.

Для Луны и Марса

Этот вики-раздел сообщества содержит ответ Трисмегистоса;

1. Перед созданием проекта настройте синтаксический анализатор Eclipse:

Окно -> Настройки -> C/C++ -> Сборка -> Настройки -> Обнаружение -> Настройки встроенного компилятора CDT GCC

в текстовом поле под названием Команда, чтобы получить спецификации компилятора добавить -std=c++14 2. Создайте проект, конфигурация зависит от того, какой проект вы создали:

Для проекта, созданного как: Файл -> Новый -> Проект -> C/C++ -> Проект C++

Щелкните правой кнопкой мыши по созданному проекту и откройте

Свойства -> Сборка C / C++ -> Настройки -> Настройки инструмента -> Компилятор GCC C++ -> Диалект

Положил -std=c++14 в текстовое поле, озаглавленное другими флагами диалекта, или выберите ISO C++11 в раскрывающемся списке Стандарт языка.

Теперь есть новый способ решить эту проблему без взлома GXX_EXPERIMENTAL.

Для самых последних версий: (в настоящее время Juno и Kepler Luna):

В более новых версиях Juno настройки находятся по адресу Project properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings (),

Старые версии 2012/2013:

  1. В C/C++ Build (в настройках проекта) найдите препроцессор "Включить путь" и перейдите на вкладку "Поставщики". Отмените выбор всех параметров, кроме настроек компилятора CDT GCC. Затем снимите отметку "Поделиться настройками записи". Добавьте параметр -std= C++ 11 в текстовое поле с именем Command, чтобы получить спецификации компилятора.

  2. Перейти к дорожкам и символам. В разделе "Символы" нажмите " Восстановить настройки по умолчанию" и затем примените.


Заметки:

Eclipse требователен к нажатию клавиши "Применить", вы должны делать это каждый раз, когда выходите из вкладки настроек.

[Самореклама]: я написал свои более подробные инструкции, основанные на вышеизложенном. http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

Спасибо пользователю Nobody на /questions/6322875/vklyuchit-c11-v-indeksatore-eclipse-cdt-junokeplerluna/6322887#6322887

Для последнего (Juno) затмения cdt у меня сработало следующее, не нужно объявлять __GXX_EXPERIMENTAL_CXX0X__ на себе. Это работает для индексатора CDT и как параметр для компилятора:

"название вашего проекта" -> правой кнопкой мыши -> свойства:

Общие сведения о C/C++ -> Включение путей препроцессора, макросов и т. Д. -> перейти на вкладку "Поставщики":

  • для "Конфигурация" выберите "Выпуск" (а затем "Отладка")

  • выключите всех провайдеров и просто выберите "Настройки встроенного компилятора CDT GCC"

  • снимите флажок "Поделиться настройками записей между проектами (глобальный поставщик)"

  • в "Команде для получения спецификаций компилятора:" добавить "-std= C++11" без кавычек (может работать и с кавычками)

  • нажмите применить и закройте варианты

  • перестроить индекс

Теперь все, что связано с C++ 11, должно корректно обрабатываться индексатором.

win7 x64, последнее официальное затмение cdt mingw-w64 gcc 4.7.2 из проекта mingwbuilds на sourceforge

У меня была такая же проблема на моем Eclipse Juno. Эти шаги решили проблему:

  • Идти к Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols],
  • Добавьте символ: __cplusplus со значением 201103L

Для Eclipse CDT Kepler, от чего мне удалось избавиться std::thread неразрешенный символ:

  1. Зайдите в Настройки->C/C++-> Сборка-> Настройки

  2. Выберите вкладку Discovery

  3. Выберите настройки встроенного компилятора CDT GCC [Shared]

  4. Добавьте -std= C++11 в поле "Команда для получения спецификации компилятора:", например:

$ {COMMAND} -E -P -v -dD -std= C++11 ${INPUTS}

  1. ОК и перестроить индекс для проекта.

Добавление -std=c++11 проэктировать Properties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->OtherФлаги были недостаточно для Kepler, однако этого было достаточно для более старых версий, таких как Helios.

Я пока не могу комментировать, поэтому пишу свой ответ:

Это связано с __GXX_EXPERIMENTAL_CXX0X__ и это действительно для Eclipse Juno и CDT 8.x.

Некоторые части этого ответа уже описаны в других ответах, но я хочу, чтобы он был последовательным.

Чтобы сделать возможным сборку с использованием stdC++11, нужно добавить специальный флаг для компилятора. Вы можете сделать это через свойства проекта. Чтобы изменить свойства проекта RMB а такжеProject properties или же ALT + ENTER, Затем C/C++ Build -> Настройки -> Настройки инструмента -> Компилятор GCC C++ -> Разное -> Другие флаги. Поместите -std= C++ 11 в конце строки, для GCC это будет выглядеть примерно так: -c -fmessage-length=0 -std=c++11, При добавлении -stdC++ 11 флаг компилятор (GCC) объявит __GXX_EXPERIMENTAL_CXX0X__ само собой.

На данный момент вы можете собрать проект, используя все достоинства C++11.

Проблема в том, что Eclipse имеет свой собственный анализатор для проверки ошибок - вот почему вы по-прежнему получаете все неприятные ошибки в редакторе Eclipse, в то же время вы можете создавать и запускать проект без каких-либо ошибок. Есть способ решить эту проблему, явно объявив __GXX_EXPERIMENTAL_CXX0X__ флаг для проекта, это можно сделать (как сказал Карстен Грайнер): C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. Нажмите "Добавить..." и пройдите __GXX_EXPERIMENTAL_CXX0X__ (убедитесь, что добавили и добавили два подчеркивания) в поле "Имя" и оставьте "Значение" пустым. А теперь это дополнительная часть, которую я хотел бы охватить в комментарии к первому ответу, перейдите по ссылке: C/C++ General -> Preprocessor Include Path Macros и т. Д. -> Providers, и выберите CDT Managed Build Setting Entries затем нажмите APPLY и вернитесь на вкладку Entries, в GNU C++ теперь должна быть CDT Managed Build Setting Entries, чтобы проверить, определено ли внутри __GXX_EXPERIMENTAL_CXX0X__ если это -> ПРИМЕНИТЬ и перестроить индекс, у вас все будет хорошо в этот момент.

У меня тоже было несколько проблем (Ubuntu 13.04 64-bit, g++-4.8, eclipse Juno 3.8.1, CDT 6.0.0). Многое упомянуто выше, извините, чтобы повторить это, но кроме того, у меня были проблемы с использованием

std::thread

как часть C++11 (добавление -pthread для компоновщика решает эту проблему). Во всяком случае, наконец, эти настройки работали нормально:

Проект -> Свойства -> Сборка C/C++ -> Настройки -> Разное. Добавить

-std=c++11

флаг для компиляторов GCC и G++. Нажмите Применить.

Для компоновщика того же окна, Разное, Флаги компоновщика, добавлено

-pthread

флаг. Настройки общей библиотеки, Имя общего объекта, добавьте

-Wl,--no-as-needed

флаг тоже. Нажмите Применить.

C/C++ Общее -> Пути и символы -> Символы TAB, GNU C++ выбран, Добавить

__GXX_EXPERIMENTAL_CXX0X__

(неважно)

флаг. Нажмите Применить.

C/C++ Общие -> Препроцессор Включить пути.. -> Вкладка Провайдеры: проверка

CDT GCC встроенные настройки компилятора

и для "Команда, чтобы получить спецификации компилятора", добавьте

-std=c++11

флаг. Снимите флажок Поделиться. Нажмите Применить.

CDT управляет записями настроек сборки, проверьте это тоже. Снимите флажки с двух других. Нажмите Применить.

Возвращаясь к вкладке Entries, GNU C++ CDT, управляет настройками сборки, вы должны увидеть добавленные

__GXX_EXPERIMENTAL_CXX0X__

запись.

Вот и все. При кодировании печатать

std::

может теперь автоматически завершать класс потока, например, сборки должны работать нормально и не должно быть

std::system_error'what(): Enable multithreading to use std::thread: Operation not permitted

во время выполнения.

Eclipse C/C++ не распознает символ std::unique_ptr даже если вы включили заголовок памяти C++11 в ваш файл.

Предполагая, что вы используете компилятор GNU C++, это то, что я сделал, чтобы исправить:

Проект -> Свойства -> Общие сведения о C / C++ -> Пути включения препроцессора -> GNU C++ -> Записи настроек пользователя CDT

  1. Нажмите на кнопку "Добавить..."

  2. Выберите "Макрос препроцессора" из выпадающего меню

    Name: __cplusplus     Value:  201103L
    
  3. Нажмите Применить, а затем ОК, чтобы вернуться к своему проекту.

  4. Затем перестройте индекс C++: Проекты -> Индекс C / C++ -> Перестроить

Я не знаю, если это только я, решение с наивысшим рейтингом не работает для меня, моя версия eclipse - это просто обычная платформа eclipse, установленная с помощью sudo apt-get install eclipse в Ubuntu. Но я нашел решение, которое использует метод вместе как из решения с наивысшим рейтингом, так и из второго, то, что я сделал для его работы, описано ниже (обратите внимание, что другие шаги, такие как создание проекта C++ и т. д., для простоты игнорируются)

После того, как вы создали проект C++

(1) C/C++ Общее -> Пути и символы -> Символы -> GNU C++. Нажмите "Добавить..." и вставьте GXX_EXPERIMENTAL_CXX0X (добавьте и добавьте два подчеркивания) в "Имя" и оставьте "Значение" пустым.

(2) В C/C++ Build (в настройках проекта) найдите препроцессор "Включить путь" и перейдите на вкладку "Поставщики". Отмените выбор всех параметров, кроме настроек компилятора CDT GCC. Затем снимите отметку "Поделиться настройками записи". Добавьте опцию -std= C++11 в текстовое поле под названием Command, чтобы получить спецификации компилятора

После выполнения выше 2 и 2 только шагов, это работает, затмение способно разрешить unique_ptr, я не знаю, почему это решение работает, надеюсь, что оно может помочь людям.

Для меня на Eclipse Neon я следовал за ответомTrismegistos здесь выше, ДА я также добавил дополнительный шаг:

  • Перейдите в проект -> Свойства -> C++ General -> Препроцессор. Включите пути, макросы и т. Д. -> Провайдеры -> Параметры встроенного компилятора CDT Cross GCC, добавьте флаг "-std= C++11"

Хит применить и ОК.

Ура,

Guy.

Я решил это таким образом на Mac. Я использовал Homebrew для установки последней версии gcc / g ++. Они попадают в / usr / local / bin с include в / usr / local / include.

Я записал CD в / usr / local / bin и сделал символическую ссылку на g++@7, что бы ни было просто на g ++, потому что @ bit раздражает.

Затем я перешел в MyProject -> Свойства -> Сборка C / C++ -> Настройки -> Компилятор GCC C++ и изменил команду с "g ++" на "/ usr / local / bin / g ++". Если вы решили не делать символическую ссылку, вы можете быть более конкретным.

Сделайте то же самое для компоновщика.

Применить и применить и закрыть. Пусть перестроит индекс. Некоторое время это показывало огромное количество ошибок, но я думаю, что это было при создании индексов. Пока я выяснял ошибки, все они исчезли без дальнейших действий.


Я думаю, не проверяя, что вы также можете зайти в Eclipse -> Properties -> C/C++ -> Core Build Toolchains и редактировать их с разными путями, но я не уверен, что это будет делать.

Чтобы получить поддержку C++14 в Eclipse Luna, вы можете выполнить следующие шаги:

  • В C++ General -> Preprocessor Include -> Providers -> CDT Cross GCC Built-in Compiler Settings, добавьте "-std= C++14"
  • В C++ Build -> Settings -> Cross G++ Compiler -> Miscellaneous, добавьте "-std= C++14"

Переиндексация вашего проекта и в конечном итоге перезапуск Eclipse. Это должно работать как ожидалось.

Ни взлом, ни более чистая версия не работают на Индиго. Взлом игнорируется, а необходимые параметры конфигурации отсутствуют. Без видимой причины, сборка начала работать после того, как она не работала и не указала причину. По крайней мере, из командной строки я получаю воспроизводимые результаты.

  • щелкните правой кнопкой мыши по проекту и перейдите в "Свойства"
  • Сборка C/C++ -> Настройки -> Настройки инструмента -> Компилятор GCC C++ -> Разное -> Другие флаги. Поместите -lm в конце текстового поля других флагов и ОК.

При использовании кросс-компилятора я часто получаю расширенные пользовательские системы сборки, тщательно созданные коллегами. Я использую "Makefile Project с существующим кодом", поэтому большинство других ответов не применимы.

В начале проекта я должен указать, что я использую кросс-компилятор в мастере для "Makefile Project с существующим кодом". Раздражает то, что в последние 10 лет или около того кнопка кросс-компилятора в этом мастере не запрашивает, где находится кросс-компилятор. Итак, на этапе, который устраняет проблему C++ и проблему кросс-компилятора, мне нужно перейти на вкладку поставщиков, как указано в ответах, таких как @ravwojdyla выше, но поставщик, который я должен выбрать, является поставщиком кросс-компилятора. Затем в поле команд я указываю полный путь к компилятору и добавляю -std=gnu++11 для стандарта C++, который я хочу поддерживать. Это работает, как и следовало ожидать.

Вы можете сделать это с существующим проектом. Единственное, что вам может потребоваться, - это перезапустить индексатор.

Мне никогда не приходилось добавлять экспериментальный флаг или отменять определение __cplusplus. Единственное, если у меня есть значительный объем современного кода C, мне некуда добавить стандартную опцию, специфичную для C.

А когда дела идут очень плохо, получение журнала анализатора с помощью этой команды в подменю Indexer может быть очень информативным.

У меня была похожая проблема с использованием Eclipse C++ 2019-03 для смешанного проекта C и C++, в котором использовались std:: option и std:: swap. То, что работало для меня, было этим. В проекте Свойства-> Сборка C / C++-> Настройки-> Настройки инструмента-> Кросс-компилятор G ++ удалите -std=gnu++17 из Разное и поместите его в Диалект-> Другие флаги диалекта.

Другие вопросы по тегам