Как включить поддержку 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 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:
В C/C++ Build (в настройках проекта) найдите препроцессор "Включить путь" и перейдите на вкладку "Поставщики". Отмените выбор всех параметров, кроме настроек компилятора CDT GCC. Затем снимите отметку "Поделиться настройками записи". Добавьте параметр -std= C++ 11 в текстовое поле с именем Command, чтобы получить спецификации компилятора.
Перейти к дорожкам и символам. В разделе "Символы" нажмите " Восстановить настройки по умолчанию" и затем примените.
Заметки:
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
неразрешенный символ:
Зайдите в Настройки->C/C++-> Сборка-> Настройки
Выберите вкладку Discovery
Выберите настройки встроенного компилятора CDT GCC [Shared]
Добавьте -std= C++11 в поле "Команда для получения спецификации компилятора:", например:
$ {COMMAND} -E -P -v -dD -std= C++11 ${INPUTS}
- ОК и перестроить индекс для проекта.
Добавление -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
Нажмите на кнопку "Добавить..."
Выберите "Макрос препроцессора" из выпадающего меню
Name: __cplusplus Value: 201103L
Нажмите Применить, а затем ОК, чтобы вернуться к своему проекту.
Затем перестройте индекс 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 из Разное и поместите его в Диалект-> Другие флаги диалекта.