Iostream не указан путь поиска включаемых файлов

Обновлено: 29.06.2024

Когда я компилирую это с g ++, это работает отлично. Когда я пытаюсь скомпилировать с Clang ++, я получаю следующую ошибку:

Работая с параметром -v , я вижу следующее:

Рассматривая эти папки по отдельности, я обнаружил, что в /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++ (или, более кратко, в /usr/include/c++ ) у меня есть следующие каталоги:

В каждом из каталогов 5 , 7 и v1 существует файл с именем iostream

Также в /usr/include/x86_64-linux-gnu существует каталог c++ , который выглядит точно так же (с каталогами 5 , 7 , 5.5.0 и 7.3.0 ,

Также в /usr/include существует каталог c++ , который выглядит точно так же, как два выше

Обновление (1)

Когда я пытаюсь построить с libc++ , я получаю следующую ошибку:

Когда я пытаюсь построить с включенным вручную путем включения, я получаю следующую ошибку:

Когда я пробую оба, я получаю следующую (невероятно большую) ошибку:

Напоминаю, что я буквально пытаюсь скомпилировать Hello, World .

Я также попытался удалить и переустановить Clang с помощью следующей команды:

Если возможно, я бы хотел, чтобы Clang работал, а не возвращался к использованию G ++, потому что моя IDE, похоже, автоматически обнаруживает Clang и использует его для проверки синтаксиса. Это означает, что каждая написанная мною программа C ++ имеет одну фатальную ошибку в первой строке («iostream not found»), а остальная часть файла не проверяется, потому что первая - фатальная ошибка.

Обновление (2)

Я попытался установить еще несколько пакетов из репозитория Ubuntu apt, но безуспешно:

Я также попытался sudo apt-get install lc++1 найти только совершенно не связанный пакет.

Обновление (3)

Я потратил еще несколько часов, пытаясь решить эту проблему, устанавливая несколько пакетов как из apt, так и из исходных текстов, пробуя разные версии различных инструментов, вручную копируя в библиотеки из других источников, и даже переходил на Clang IRC и общался с несколькими очень хорошо осведомленными разработчиками напрямую. ,

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

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

3 ответа

Я также был обеспокоен этой проблемой в течение длительного времени. Вы должны попытаться удалить папку (cd / usr / lib / gcc / aarch64-linux-gnu / 8). Причина, по которой clang ++ не может работать, состоит в том, что эта папка не содержит libstdc ++. A.

Проверьте, что все папки в / usr / lib / gcc / aarch64-linux-gnu / clang ++ выберут последнюю, убедитесь, что в последнем есть libstdc ++. a

Есть установленная Студия 2015.
Добавил в PATH C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe
Создал тестовую программу(Hello World). При запуске cl test.cpp матерится:

Гугл посоветовал запустить скрипт C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32. Запустил. Нифига, ошибка осталась.
Вопрос: как все-таки запустить этот чертов компилятор из дефолтной командной строки?

Простой 2 комментария

Nipheris

Действительно есть необходимость из дефолтной вызывать? Девелоперская преднастроенная не подойдёт? Если нет, то откройте её и посмотрите что запускается при старте, сделайте себе также. Про батик почти правильно, но запускать надо "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" с соответствующим ключом. Посмотрите в ярлыках, про которые писал res2001, так как раз оно и запускается. Чтобы переименные среды сработали надо вызвать этот командный файл через call внутри одного командного файла с командой cl.exe (и прочими). Еще вариант - вызвать в одной строке две команды, сперва командный файл, потом, через & cl.exe.

В PATH нужно добавлять каталог (C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin), а не cl.exe

Но ошибка говорит, что у вас не указан путь поиска ВКЛЮЧАЕМЫХ файлов.
То есть сам cl.exe находит. Вам нужно добавить опцию /I или -I с указанием, где include файлы лежат

cl.exe -Ic:\src test.cpp

Со студией поставляется комплект командных сценариев, настраивающих окружение командной строки для работы компилятора. Достаточно командную строку запускать через эти сценарии. Ярлыки на эти сценарии находятся в меню Пуск в папке студии.
Например у меня для VS2017 есть такие:
x64 Native Tools Command Prompt for VS 2017
x86 Native Tools Command Prompt for VS 2017
Соответственно для 64битной и 32битной сборки приложений. В 2015 студии есть аналогичные, только название немного изменено.
Запускайте ком.строку через этот сценарий и все будет собираться. неудобно потом в файловой системе блуждать. Так в любой директории Shift+ПКМ -> Открыть терминал в текущей директории.

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

Если немного заморочиться можно руками добавить аналогичный пункт в контекстное меню с предварительным запуском скрипта настройки среды.

Некоторые вещи, которые вы должны проверить:

Проверьте папку include в вашей версии VS (в " C:\Program Files\Microsoft Visual Studio xx.x\VC\include "проверьте файл, который вы включаете, iostream убедитесь, что это там).

Проверьте свои проекты Включить каталоги в <Project Name> > Properties > Configuration Properties > VC++ Directories > Include Directories - (это должно выглядеть так: $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include; )

Убедитесь, что вы выбрали правильный проект для этого кода ( File > New > Project > Visual C++ > Win32 Console Application )

Убедитесь, что у вас нет <iostream.h> В любом месте ваших файлов кода VS не поддерживает это (в том же проекте проверьте ваши другие файлы кода, файлы.cpp и.h для <iostream.h> и удали это).

Убедитесь, что у вас не более одного main() Функция в файлах кода вашего проекта (в том же проекте, проверьте ваши другие файлы кода,.cpp и.h файлы для main() и удалите его или замените другим именем).

Некоторые вещи, которые вы можете попробовать построить с помощью:

  • исключать using namespace std; от твоего main() и поместите его после директивы include.
  • использование std::cout без using namespace std; ,

Вышесказанное сработало для меня. Ниже не сделал:

Это также не удалось:

Скорее всего, вам не хватает $(IncludePath) в Свойства-> Каталоги VC++-> Включить каталоги. Добавление этого должно сделать iostream и других видимыми снова. Вы, вероятно, удалили его по ошибке при настройке программы.

Я получил эту ошибку при создании консольного приложения "Пусто" в Visual Studio 2015. Я заново создал приложение, оставив флажок "Пусто" незаполненным, в него были добавлены все необходимые библиотеки.

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

Если на ваши каталоги включения правильно ссылаются в листе свойств проекта VC++ -> Свойства конфигурации -> Каталоги VC++ -> Включить каталоги. Путь указан в макросе $(VC_IncludePath) В моем VS 2015 это оценивается как: "C:\Program Файлы (x86)\Microsoft Visual Studio 14.0\VC\include"

Это сделало это для меня.

Вот консольный проект на C++ win32!

Теперь вот консольный проект C++ CLR!

другие вещи, которые вы узнаете из отладки, чтобы добавить для избежания ошибок

По мере увеличения размера программ весь код уже не помещается в нескольких файлах, записывать каждый раз предварительные объявления для функций, которые мы хотим использовать, но которые находятся в других файлах, становится всё утомительнее и утомительнее. Хорошо было бы, если бы все предварительные объявления находились в одном месте, не так ли?

Заголовочные файлы из Стандартной библиотеки C++

Рассмотрим следующую программу:

Результат выполнения программы:

Как правило, в заголовочных файлах записываются только объявления, без определений. Следовательно, если cout только объявлен в заголовочном файле iostream, то где же он определяется? Ответ: в Стандартной библиотеке С++, которая автоматически подключается к вашему проекту на этапе линкинга.


Пишем свои собственные заголовочные файлы

Теперь давайте вернемся к примеру, который мы обсуждали на предыдущем уроке. У нас было два файла: add.cpp и main.cpp.

int add ( int x , int y ) ; // предварительное объявление с использованием прототипа функции std :: cout << "The sum of 3 and 4 is " << add ( 3 , 4 ) << std :: endl ;

Примечание: Если вы создаете все файлы заново, то не забудьте добавить add.cpp в свой проект, чтобы он был подключен к компиляции.

И здесь нам на помощь приходят заголовочные файлы. Достаточно просто написать один заголовочный файл и его можно будет повторно использовать в любом количестве программ. Также и вносить изменения в такой код (например, добавление еще одного параметра) гораздо легче, нежели чем шерстить по всем файлам в поисках используемых функций.

Написать свой собственный заголовочный файл не так уж и сложно. Заголовочные файлы состоят из двух частей:

Директивы препроцессора — в частности, header guards, которые предотвращают вызов заголовочного файла больше одного раза из одного и того же файла (об этом детально на следующем уроке).

Содержимое заголовочного файла — набор объявлений.

Все ваши заголовочные файлы (которые вы написали самостоятельно) должны иметь расширение .h .

// Начнем с директив препроцессора. ADD_H – это произвольное уникальное имя (обычно используется имя заголовочного файла) int add ( int x , int y ) ; // прототип функции add() (не забывайте точку с запятой в конце!)

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

main.cpp, в котором мы подключаем add.h:

std :: cout << "The sum of 3 and 4 is " << add ( 3 , 4 ) << std :: endl ;

add.cpp остается без изменений:

Если вы получили ошибку от линкера, что функция аdd() не определена, то убедитесь, что вы корректно подключили add.cpp к вашему проекту (и к компиляции тоже)!

Стоит отметить, что одни заголовочные файлы могут подключать другие заголовочные файлы. Тем не менее, так делать не рекомендуется.

Почему iostream пишется без окончания .h?

Когда C++ только создавался, все файлы библиотеки Runtime имели окончание .h. Оригинальные версии cout и cin объявлены в iostream.h. При стандартизации языка С++ комитетом ANSI, решили перенести все функции из библиотеки Runtime в пространствo имен std, чтобы предотвратить возможность возникновения конфликтов имен с пользовательскими идентификаторами (что, между прочим, является хорошей идеей). Тем не менее, возникла проблема: если все функции переместить в пространство имен std, то старые программы переставали работать!

Когда вы подключаете заголовочный файл из Стандартной библиотеки C++, убедитесь, что вы используете версию без .h (если она существует). В противном случае, вы будете использовать устаревшую версию заголовочного файла, который уже больше не поддерживается.

Кроме того, многие библиотеки, унаследованные от языка Cи, которые до сих пор используются в C++, также были продублированы с добавлением префикса c (например, stdlib.h стал cstdlib). Функционал этих библиотек также перенесли в пространство имен std, чтобы избежать возможность возникновения конфликтов имен с пользовательскими идентификаторами.

Можно ли записывать определения в заголовочных файлах?

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

Иногда делаются исключения для простых функций, которые вряд ли изменятся (например, где определение состоит всего лишь из одной строки).

Советы

Вот несколько советов по написанию собственных заголовочных файлов:

Всегда используйте директивы препроцессора.

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

Читайте также: