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


210

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 перестать жаловаться на подобные ошибки?


12
По крайней мере, так должно бытьstd::unique_ptr<char[]>
Cubbi

Не уверен, что это правильно - char [] можно преобразовать в char *, а unique_ptr <char> - это указатель на char, например char *
Ник

1
Не будет unique_ptr<char>звонить delete, что неправильно, так как он был создан с new[]?
Дитрих Эпп

6
@ Ник: Нет, он прав. То, как вы это написали, вызовет delete, когда вам нужно будет delete[] позвонить. unique_ptr<char>Предполагает , что он получает указатель, который будет удален с delete. unique_ptr<char[]>ожидает массив, который удаляется с delete[]правильно.
Николь Болас

Похожие
страницы

Ответы:


224

Я нашел эту статью на форуме 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__(обязательно добавьте и добавьте два подчеркивания) в поле «Имя» и оставьте поле «Значение» пустым.
  • Нажмите «Применить», сделайте все, что от вас требуется, затем нажмите «ОК».

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

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


2
Да, это сработало! Но обязательно добавьте и добавьте два подчеркивания к GXX_EXPERIMENTAL_CXX0X - я приму это в это время
Ник

5
Это убрало ложные ошибки редактора? У меня нет проблем с компиляцией, и распознаются новые типы std, но я не могу избавиться от синтаксических ошибок редактора для диапазонов, основанных на циклах и ссылках на rvalue &&.
juanchopanza

7
Теперь возникает естественный вопрос: можем ли мы оптимизировать наш рабочий процесс, сохранив эти конкретные параметры проекта C ++ в новом шаблоне проекта Eclipse, например, «C ++ 11 Project»?
Нордлёв

38
Примечание: для тех, кто ищет ответ для Юноны, это не работает .
Кристофер

4
Для kepler / juno решение найдено в этом ответе . Это опубликовано в редактировании ответа Йохана Лундберга ниже, но я также отмечу это здесь, чтобы сделать принятый ответ более полным.
Неиспользуемый Lumière

150

Инструкция для 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.


1
Работал отлично даже без перезапуска затмения. Спасибо.
Прасаннак

Спасибо. Никакой другой ответ не помог мне и на Луне.
Мохамед Эль-Накиб

Все еще работает на Марсе. Более чем отличный ответ! Если бы я только мог проголосовать за этот ответ дважды!
Мохаммед эль-Накиб

Спасибо! Это самый полезный ответ на проблему, с которой я столкнулся (4.5)
AturSams

2
Для Eclipse Neon.3, с проектом Makefile на C ++, добавляемый параметр проекта -std=c++11был Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers [tab] -> CDT GCC Built-in Compiler Settings -> Command used to get compiler specs:. Добавьте -std=c++11к этому. Мне предложили установить его в глобальных настройках рабочего пространства, но он не был скопирован в папку, которую я описал выше, когда я создал новый Makefileпроект.
BeeOnRope

112

Обновление 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на https://stackoverflow.com/a/13635080/1149664


3
Спасибо, но это не помогло мне решить c ++ 11 ссылок. Программа компилируется правильно, но затмение не может разрешить их. Когда я проверяю «массив», #ifndef __GXX_EXPERIMENTAL_CXX0X__возвращает true и код ниже не анализируется. Когда я добавляю __GXX_EXPERIMENTAL_CXX0X__в символы проекта, массив разрешается, но ссылки моего проекта путаются. В чем может быть проблема здесь?
Халил Каскавальцы

1
Я думаю, что это ошибка. Я воспроизвел это так: Откройте новый проект. Включить функции C ++ 11. Добавьте случайный класс с публичной переменной. Создать вектор этого случайного класса. Получить итератор. Попробуйте получить доступ к публичной переменной. Либо мое рабочее пространство повреждено, либо в Eclipse есть ошибка, которая не может разобрать это.
Халил Каскавальцы

1
@HalilKaskavalci Я нашел эту же ошибку. Если я установлю редактор для c ++ 11, итераторы не смогут разрешить. Если я не, std :: unique_ptr не может разрешить. Действительно раздражает, так как я использую оба.
Киан

1
@Kian Я сообщил об ошибке. bugs.eclipse.org/bugs/show_bug.cgi?id=397027 . Это довольно раздражает, и я начал использовать библиотеки boost, они не выдают ошибку :)
Halil Kaskavalci

1
работает для меня! Спасибо! (сделал это по вашей ссылке) Я добавил -std = c ++ 11 к провайдерам и восстановил значения по умолчанию в символах. Я думаю, восстановление по умолчанию в символах спасает меня. Теперь unique_ptr разрешается.
Денис Заикин

20

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

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

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

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

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

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

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

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

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

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

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


по-прежнему получаю те же ошибочные предупреждения редактора, что и в Type 'std :: thread', не удается разрешить, даже если он компилируется и выполняется нормально
Скотт Стенсланд

2
вам нужно один раз скомпилировать с новыми настройками, чтобы парсер «узнал», что установлен флаг std = c ++ 11
Andreas

в зависимости от версии компилятора может быть необходимо добавить -std = c ++ 0x вместо -std = c ++ 11 (например, debian wheezy)
xmoex

15

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

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

2
Это должен быть принят ответ, так как он работает и для проектов Makefile!
omikron

@ Jerk31, это не работает для Eclipse Juno, работающей на Windows (для меня), я все еще вижу эти жалованные ненужные ошибки, несмотря на то, что двоичный файл работает нормально. Пожалуйста, помогите мне!!!
переиздание

Мне очень жаль, что я не могу помочь вам в Windows. У меня нет возможности попробовать выполнить какой-либо проект C ++ в этой ОС. Я желаю вам всего наилучшего и удачи!
Джером

13

Для 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.


Для Eclipse версии: 2019-09 R. Это решение сработало для меня, однако я провел много времени до этого. Проблема была в Настройках построителя: Проект -> Свойства -> Сборка C / C ++: на вкладке «Настройки построителя» выберите «Внутренний построитель» для «Тип построителя».
grekhss

5

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

Он связан с __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__ли она -> APPLY, и перестройте индекс, с этим все будет в порядке.


3

У меня тоже было несколько проблем (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 управляет записями настроек сборки, проверьте это тоже. Снимите флажки с двух других. Нажмите Применить.

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

__GXX_EXPERIMENTAL_CXX0X__

запись.

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

std::

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

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

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


Это был Project -> Properties -> C/C++ Build -> Settings -> Miscellaneousшаг, который работал для меня. Спасибо большое: D
Jake88

2

Я не знаю, только ли это я, решение с наивысшим рейтингом не работает для меня, моя версия 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, я не знаю, почему это решение работает, надеюсь, что оно может помочь людям.


Это также сработало для меня (затмение неон). Сначала я не отменял выбор других провайдеров, что все еще вызывало проблемы, но отменил выбор всех других провайдеров, кроме «Настройки встроенного компилятора CDT GCC» и «Настройки пользователя CDT». Спасибо!
zpon

2

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 2018-12. «Принятый» ответ и т. Д. Больше не работают в 2018-12 гг.
Дэвид Штайнхауэр

1

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

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

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

Ура,

Guy.


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

Какая версия Eclipse это?
Брайам

0

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


0

Чтобы получить поддержку 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. Это должно работать как ожидалось.


0

Я решил это таким образом на 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 и отредактировать их с разными путями, но я не уверен, что это будет делать.


0

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


0

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.