Ошибка при открытии include файла

Убрал , получил:
1>—— Построение начато: проект: 2.Урок, Конфигурация: Debug Win32 ——
1>Компиляция…
1>domashka.cpp
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(6) : error C2143: синтаксическая ошибка: отсутствие «;» перед «namespace»
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(6) : error C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(6) : error C2059: синтаксическая ошибка: ;
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(12) : error C2440: инициализация: невозможно преобразовать ‘const char [7]’ в ‘char’
1> Не существует контекста, в котором такое преобразование возможно
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(12) : error C2144: синтаксическая ошибка: перед «char» требуется «;»
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(13) : error C2440: инициализация: невозможно преобразовать ‘const char [9]’ в ‘char’
1> Не существует контекста, в котором такое преобразование возможно
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(13) : error C2144: синтаксическая ошибка: перед «int» требуется «;»
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(14) : error C2144: синтаксическая ошибка: перед «char» требуется «;»
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(15) : error C2440: инициализация: невозможно преобразовать ‘const char [20]’ в ‘char’
1> Не существует контекста, в котором такое преобразование возможно
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(15) : error C2144: синтаксическая ошибка: перед «char» требуется «;»
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(19) : error C2440: инициализация: невозможно преобразовать ‘const char [7]’ в ‘char’
1> Не существует контекста, в котором такое преобразование возможно
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(19) : error C2146: синтаксическая ошибка: отсутствие «;» перед идентификатором «cout»
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(19) : error C2065: cout: необъявленный идентификатор
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(20) : error C2065: cout: необъявленный идентификатор
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(21) : error C2065: cout: необъявленный идентификатор
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(22) : error C2065: cout: необъявленный идентификатор
1>c:usersanonymousdocumentsvisual studio 2008projects2.урок2.урокdomashka.cpp(23) : error C2065: cout: необъявленный идентификатор
1>Журнал построения был сохранен в «file://c:UsersAnonymousDocumentsVisual Studio 2008Projects2.Урок2.УрокDebugBuildLog.htm»
1>2.Урок — ошибок 17, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Добавлено через 4 минуты
Вроде нашел свою проблему . Сейчас почитаю .

Fatal error C1083: Cannot open precompiled header file: ‘Debugproject.pch’: No such file or directory

Вы пытаетесь скомпилировать файл, который использует precompiled header. Но соответствующий *.pch файл отсутствует. Возможные причины:
Файл stdafx.cpp не компилировался и, как следствие, *.pch файл ещё не создан. Такое может быть, если, например, в начале очистить проект (Clean Solution), а потом попробовать скомпилировать один *.cpp файл (Compile Ctrl-F7). Решение: скомпилируйте проект целиком или как минимум файл stdafx.cpp.
В настройках ни указано ни одного файла, из которого должен генерироваться *.pch файл. Речь идёт о ключе компиляции /Yc. Как правило, такая ситуация возникает у начинающих, которые захотели использовать precompiled headers для своего проекта. Как это сделать описано выше в разделе «Как использовать Precompiled Headers».

I have recently gone from Code::Blocks to Visual Studio, and in Code::Blocks one could just add a class and then include it straight away. However, whenever I do the same in Visual Studio with the following statement:

#include "includedFile.h"

or

#include "include/includedFile.h"

It doesn’t work and instead I get the error:

cannot open include file: ‘includedFile.h’; no such file or directory.

Is there some box or setting that I have to tick? Or do I have to add each header as a dependency manually?

Here is the code for the class in question:

Public.h:

    #pragma once
    class Public
    {
        public:
            static const int SCREEN_WIDTH=1000;
            static const int SCREEN_HEIGHT=1250;
            Public(void);
            ~Public(void);
    };

Public.cpp:

    #include "Public.h"


    Public::Public(void)
    {
    }


    Public::~Public(void)
    {
    }

How it is being included:

    #include "Public.h"

Community's user avatar

asked Oct 16, 2013 at 23:08

user2853108's user avatar

2

I had this same issue going from e.g gcc to visual studio for C programming. Make sure your include file is actually in the directory — not just shown in the VS project tree. For me in other languages copying into a folder in the project tree would indeed move the file in. With Visual Studio 2010, pasting into «Header Files» was NOT putting the .h file there.

Please check your actual directory for the presence of the include file. Putting it into the «header files» folder in project/solution explorer was not enough.

answered Dec 3, 2013 at 2:56

Yablargo's user avatar

YablargoYablargo

3,5207 gold badges36 silver badges58 bronze badges

Go to your Project properties (Project -> Properties -> Configuration Properties -> C/C++ -> General) and in the field Additional Include Directories add the path to your .h file.

And be sure that your Configuration and Platform are the active ones. Example: Configuration: Active(Debug) Platform: Active(Win32).

answered May 8, 2016 at 19:41

Radu Ruse's user avatar

Radu RuseRadu Ruse

4214 silver badges2 bronze badges

6

You need to set the path for the preprocessor to search for these include files, if they are not in the project folder.

You can set the path in VC++ Directories, or in Additional Include Directories. Both are found in project settings.

JBentley's user avatar

JBentley

6,0495 gold badges37 silver badges72 bronze badges

answered Oct 16, 2013 at 23:19

Chris Olsen's user avatar

Chris OlsenChris Olsen

3,21326 silver badges41 bronze badges

1

By default, Visual Studio searches for headers in the folder where your project is ($ProjectDir) and in the default standard libraries directories. If you need to include something that is not placed in your project directory, you need to add the path to the folder to include:

Go to your Project properties (Project -> Properties -> Configuration Properties -> C/C++ -> General) and in the field Additional Include Directories add the path to your .h file.

You can, also, as suggested by Chris Olen, add the path to VC++ Directories field.

answered Oct 16, 2013 at 23:50

tomi.lee.jones's user avatar

tomi.lee.jonestomi.lee.jones

1,5631 gold badge15 silver badges22 bronze badges

9

I found this post because I was having the same error in Microsoft Visual C++. (Though it seems it’s cause was a little different, than the above posted question.)

I had placed the file, I was trying to include, in the same directory, but it still could not be found.

My include looked like this: #include <ftdi.h>

But When I changed it to this: #include "ftdi.h" then it found it.

answered Jul 30, 2015 at 17:12

Joe's user avatar

JoeJoe

8,1313 gold badges17 silver badges23 bronze badges

3

If your problem is still there it’s certainly because you are trying to compile a different version from your current settings.

For example if you set your Additional Include Directories in Debug x64, be sure that you are compiling with the same configuration.

Check this: Build > Configuration Manager... > There is problably something like this in your active solution configuration: Debug x86 (Win32) platform.

answered Mar 7, 2019 at 14:13

Patapoom's user avatar

PatapoomPatapoom

7741 gold badge7 silver badges16 bronze badges

1

For me, it helped to link the projects current directory as such:

In the properties -> C++ -> General window, instead of linking the path to the file in «additional include directories». Put «.» and uncheck «inheret from parent or project defaults».

Hope this helps.

answered Feb 27, 2019 at 14:20

mkohler's user avatar

I tried the other answers here as well, but my problem had nothing to do with the include paths or files missing incorrect #includes. I had two configurations, each set to the exact same include directories. One configuration could resolve the includes, the other could not.

After selecting my project and going to Project -> Properties, I selected both configurations through the Configuration dropdown -> Multiple Configurations… option. Comparing the two I found that C/C++ -> Language -> Conformance Mode was different. The «incorrect» configuration had a value of Default for some reason, and switching it to Yes or No allowed the paths to be resolved.

TL;DR: If you have one configuration with the same include directories but the other isn’t finding the files, I suggest to try comparing the configurations.

answered Apr 28, 2021 at 21:08

gigabot's user avatar

If you’ve tried the other answers and your include file still can’t be found, here are some additional debugging steps and sanity-checks:

  • Ensure that you are building to a platform that is supported by your code. (If not, consider removing this platform as a target)
  • Verify that the filename/path is correct. Modify your source code to #include the whole absolute path of the header file instead, and see if the file can be found now. If not, copy-paste the path from your source code into a command line to validate that the file exists at that full path with no typos. Open the header file to ensure you have read access. (Change the source code back when done.)
  • If you’ve already added the path to Additional Include Directories, try clicking the drop-down combo box for Additional Include Directories, and select <Edit...>. This will show you evaluated values of paths. (If it does not show the correct evaluated values, variables in your path might not be set. Click Macros>> to see variables.) Copy-paste the evaluated path into windows explorer to validate that the path exists.
  • Create a new empty C++ «Windows Console Application» project. Set just the one Include Directory, and #include just the one file in your main.cpp, and see if that builds.

answered Feb 20, 2019 at 21:09

cowlinator's user avatar

cowlinatorcowlinator

6,9726 gold badges41 silver badges60 bronze badges

Недавно я перешел из Code::Blocks в Visual Studio, а в Code:: Blocks можно просто добавить класс, а затем включить это сразу. Однако, когда я делаю то же самое в Visual Studio со следующим утверждением:

#include "includedFile.h"

или

#include "include/includedFile.h"

Это не работает, и вместо этого я получаю сообщение об ошибке:

не может открыть файл include: ‘includedFile.h’; нет такого файла или каталога.

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

Вот код для рассматриваемого класса:

Public.h:

    #pragma once
    class Public
    {
        public:
            static const int SCREEN_WIDTH=1000;
            static const int SCREEN_HEIGHT=1250;
            Public(void);
            ~Public(void);
    };

Public.cpp:

    #include "Public.h"


    Public::Public(void)
    {
    }


    Public::~Public(void)
    {
    }

Как он включается:

    #include "Public.h"

17 окт. 2013, в 02:08

Поделиться

Источник

7 ответов

У меня была такая же проблема, например, от gcc до visual studio для программирования на C. Убедитесь, что ваш файл include находится в каталоге, а не только в дереве проектов VS. Для меня на других языках, копирование в папку в дереве проектов действительно переместило бы файл. С Visual Studio 2010 вставка в «Заголовочные файлы» не помещала там файл .h.

Пожалуйста, проверьте фактический каталог на наличие включенного файла. Недостаточно вложить его в папку «файлы заголовков» в проводнике проекта/решения.

Yablargo
03 дек. 2013, в 04:06

Поделиться

Вам нужно установить путь для препроцессора для поиска этих включенных файлов, если они не находятся в папке проекта.

Вы можете установить путь в VС++ Directories или в Дополнительное включение Справочники. Оба находятся в настройках проекта.

Chris Olsen
17 окт. 2013, в 00:07

Поделиться

По умолчанию Visual Studio ищет заголовки в папке, где находится ваш проект ($ ProjectDir), и в стандартных каталогах стандартных библиотек. Если вам нужно включить что-то, что не помещено в каталог проекта, вам нужно добавить путь к папке, чтобы включить:

Перейдите к своим свойствам проекта (Проект → Свойства → Свойства конфигурации → C/С++ → Общие), а в поле Additional Include Directories добавьте путь к вашему .h файлу.

Вы также можете, как предложил Крис Олен, добавить путь к полю каталогов VС++.

tomi.lee.jones
17 окт. 2013, в 00:29

Поделиться

Перейдите к своим свойствам проекта (Project → Properties → Configuration Properties → C/С++ → General), а в поле Additional Include Directories добавьте путь к вашему .h файлу.

И убедитесь, что ваша конфигурация и платформа являются активными. Пример: Конфигурация: активная (отладка) Платформа: активная (Win32).

Radu Ruse
08 май 2016, в 20:30

Поделиться

Я нашел этот пост, потому что у меня была такая же ошибка в Microsoft Visual С++. (Хотя кажется, что причина была немного иной, чем предыдущий вопрос.)

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

My include выглядит так: #include <ftdi.h>

Но когда я изменил его на это: #include "ftdi.h", он нашел его.

Joe
30 июль 2015, в 18:27

Поделиться

Щелкните правой кнопкой мыши → Выберите Свойства → Общие → Проверьте «Windows SDK Versiyon»

Если вы установите 8.1 и 10.x, выберите 10.x.

kemalkirezci
07 авг. 2017, в 20:30

Поделиться

Ещё вопросы

  • 0Получить счет из двух разных таблиц на основе datetime в MySQL
  • 1Код Python 3.5 / 3.6 в зависимости от порядка вставки dict
  • 1Поместите JLabel поверх другой JLabel, как в пасьянсе
  • 0Как я могу добавить переменную php в javascript?
  • 0Исключение отрисовки формы Symfony после Post / Redirect / Get на той же странице
  • 0Mysql-запрос с левым соединением — специализировать индекс, если две строки совпадают
  • 0Объявите заполнитель с auto_increment в базе данных MySQL
  • 0Medoo — Обновление строки таблицы, соответствующей нескольким полям
  • 1Xpath Java получает элемент, проверяя значение
  • 0Angular JS получить вопрос о входном значении
  • 0плагин проверки jquery, условный удаленный вызов не работает должным образом
  • 0Отметьте флажок, когда ссылка нажата — jquery
  • 1Декомпрессия ZLib
  • 0как вызвать функцию angular синхронно, чтобы вернуть результат функции вне angular
  • 1Объект должен сохранять свой статус
  • 0Путаница с машинно-зависимыми значениями указателей
  • 0Предоставление доступа нескольким пользователям к состоянию сеансов на AngularJs (JHipster Project)
  • 1Определить, когда анимация завершена (AnimationListener)
  • 1В облачных функциях Firebase отказано в доступе
  • 0Замена липкого заголовка вторым заголовком, когда он достигает текущего застрявшего заголовка
  • 1Ошибка типа: button_click () отсутствует 1 обязательный позиционный аргумент: ‘self’
  • 1Python: OpenCV findHomography входы
  • 1Модульное тестирование AlertDialog — java.lang.VerifyError: Неверный тип в стеке операндов
  • 1Как превратить TimePicker Джонатаса Уокера в плагин класса JS или jQuery
  • 0Невозможно получить доступ к методам, которые были добавлены через Prototype в объект Javascript.
  • 0Как установить высоту div на фиксированную ширину div
  • 0Прокрутка страницы как параллакс
  • 1Почему вывод int?
  • 0преобразование текста: полная ширина не работает в Опере — HTML
  • 0Значение stream_get_contents не является фактическим значением
  • 0fnfilter проблема поиска в datatables
  • 0ngModel передал через оболочку директиве child
  • 0SQL: Найти всех пользователей, которые имеют свойства в данном списке брендов.
  • 0Автоматически включая несколько исходных файлов с -gcc?
  • 1FolderBrowserDialog с MVC 4?
  • 0Два всплывающих окна не работают должным образом
  • 1Приложения Сценарии авторизации OAuth2 с использованием гэппи из HtmlService
  • 1Определить точку столкновения двух объектов
  • 1Контейнер для изображения
  • 1MVC Solution установлен в формат даты США
  • 0Заставьте div (s) исчезать, когда пользователь начинает прокрутку, и заставляйте его появляться, когда пользователь прекращает прокрутку
  • 1Строка для XMLGregorianCalendar проблема
  • 0Вставка данных в MySQL DB с использованием Python [дубликаты]
  • 0заменить каждое выбранное значение случайной буквой / цифрой
  • 0как мне эффективно искать до и после элемента для ключевой фразы
  • 1Как выбрать переменные в массиве (A) со значениями из переменной (B)
  • 0получение функции из класса не работает
  • 0XML-файл загрузки с PHP
  • 0Как загрузить изображения на разные URL с помощью ckeditor?
  • 1Каким будет путь к пакету служб SSIS?

Сообщество Overcoder

Он немаленький. Надеюсь, меня не забанят…
/*
Скетч к проекту «Адресная матрица»
Гайд по постройке матрицы: https://alexgyver.ru/matrix_guide/
Страница проекта (схемы, описания): https://alexgyver.ru/GyverMatrixBT/
Подробное описание прошивки: https://alexgyver.ru/gyvermatrixos-guide/
Исходники на GitHub: https://github.com/AlexGyver/GyverMatrixBT/
Нравится, как написан код? Поддержи автора! https://alexgyver.ru/support_alex/
Автор: AlexGyver Technologies, 2018
https://AlexGyver.ru/
*/

// GyverMatrixOS
// Версия прошивки 1.12, совместима с приложением GyverMatrixBT версии 1.12 и выше
// 1.12 — поправлен косяк с кнопкой SET на wemos/nodemcu

// ************************ МАТРИЦА *************************
// если прошивка не лезет в Arduino NANO — отключай режимы! Строка 60 и ниже

#define BRIGHTNESS 150 // стандартная маскимальная яркость (0-255)
#define CURRENT_LIMIT 4000 // лимит по току в миллиамперах, автоматически управляет яркостью (пожалей свой блок питания!) 0 — выключить лимит

#define WIDTH 30 // ширина матрицы
#define HEIGHT 15 // высота матрицы
#define SEGMENTS 1 // диодов в одном «пикселе» (для создания матрицы из кусков ленты)

#define COLOR_ORDER GRB // порядок цветов на ленте. Если цвет отображается некорректно — меняйте. Начать можно с RGB

#define MATRIX_TYPE 0 // тип матрицы: 0 — зигзаг, 1 — параллельная
#define CONNECTION_ANGLE 0 // угол подключения: 0 — левый нижний, 1 — левый верхний, 2 — правый верхний, 3 — правый нижний
#define STRIP_DIRECTION 1 // направление ленты из угла: 0 — вправо, 1 — вверх, 2 — влево, 3 — вниз
// при неправильной настрйоке матрицы вы получите предупреждение «Wrong matrix parameters! Set to default»
// шпаргалка по настройке матрицы здесь! https://alexgyver.ru/matrix_guide/

#define MCU_TYPE 1 // микроконтроллер:
// 0 — AVR (Arduino NANO/MEGA/UNO)
// 1 — ESP8266 (NodeMCU, Wemos D1)
// 2 — STM32 (Blue Pill)

// ******************** ЭФФЕКТЫ И РЕЖИМЫ ********************
#define D_TEXT_SPEED 100 // скорость бегущего текста по умолчанию (мс)
#define D_EFFECT_SPEED 80 // скорость эффектов по умолчанию (мс)
#define D_GAME_SPEED 250 // скорость игр по умолчанию (мс)
#define D_GIF_SPEED 80 // скорость гифок (мс)
#define DEMO_GAME_SPEED 60 // скорость игр в демо режиме (мс)

boolean AUTOPLAY = 1; // 0 выкл / 1 вкл автоматическую смену режимов (откл. можно со смартфона)
int AUTOPLAY_PERIOD = 10; // время между авто сменой режимов (секунды)
#define IDLE_TIME 10 // время бездействия кнопок или Bluetooth (в секундах) после которого запускается автосмена режимов и демо в играх

// о поддерживаемых цветах читай тут https://alexgyver.ru/gyvermatrixos-guide/
#define GLOBAL_COLOR_1 CRGB::Green // основной цвет №1 для игр
#define GLOBAL_COLOR_2 CRGB::Orange // основной цвет №2 для игр

#define SCORE_SIZE 0 // размер символов счёта в игре. 0 — маленький для 8х8 (шрифт 3х5), 1 — большой (шрифт 5х7)
#define FONT_TYPE 1 // (0 / 1) два вида маленького шрифта в выводе игрового счёта

// ************** ОТКЛЮЧЕНИЕ КОМПОНЕНТОВ СИСТЕМЫ (для экономии памяти) *************
// внимание! отключение модуля НЕ УБИРАЕТ его эффекты из списка воспроизведения!
// Это нужно сделать вручную во вкладке custom, удалив ненужные функции

#define USE_BUTTONS 0 // использовать физические кнопки управления играми (0 нет, 1 да)
#define BT_MODE 1 // использовать блютус (0 нет, 1 да)
#define USE_NOISE_EFFECTS 1 // крутые полноэкранные эффекты (0 нет, 1 да) СИЛЬНО ЖРУТ ПАМЯТЬ!!!11
#define USE_FONTS 1 // использовать буквы (бегущая строка) (0 нет, 1 да)
#define USE_CLOCK 0 // использовать часы (0 нет, 1 да)

// игры
#define USE_SNAKE 1 // игра змейка (0 нет, 1 да)
#define USE_TETRIS 1 // игра тетрис (0 нет, 1 да)
#define USE_MAZE 1 // игра лабиринт (0 нет, 1 да)
#define USE_RUNNER 1 // игра бегалка-прыгалка (0 нет, 1 да)
#define USE_FLAPPY 1 // игра flappy bird
#define USE_ARKAN 1 // игра арканоид

// ****************** ПИНЫ ПОДКЛЮЧЕНИЯ *******************
// Arduino (Nano, Mega)
#if (MCU_TYPE == 0)
#define LED_PIN 6 // пин ленты
#define BUTT_UP 3 // кнопка вверх
#define BUTT_DOWN 5 // кнопка вниз
#define BUTT_LEFT 2 // кнопка влево
#define BUTT_RIGHT 4 // кнопка вправо
#define BUTT_SET 7 // кнопка выбор/игра

// пины подписаны согласно pinout платы, а не надписям на пинах!
// esp8266 — плату выбирал Wemos D1 R1
#elif (MCU_TYPE == 1)
#define LED_PIN 2 // пин ленты
#define BUTT_UP 14 // кнопка вверх
#define BUTT_DOWN 13 // кнопка вниз
#define BUTT_LEFT 0 // кнопка влево
#define BUTT_RIGHT 12 // кнопка вправо
#define BUTT_SET 15 // кнопка выбор/игра

// STM32 (BluePill) — плату выбирал STM32F103C
#elif (MCU_TYPE == 2)
#define LED_PIN PB12 // пин ленты
#define BUTT_UP PA1 // кнопка вверх
#define BUTT_DOWN PA3 // кнопка вниз
#define BUTT_LEFT PA0 // кнопка влево
#define BUTT_RIGHT PA2 // кнопка вправо
#define BUTT_SET PA4 // кнопка выбор/игра
#endif

// ******************************** ДЛЯ РАЗРАБОТЧИКОВ ********************************
#define DEBUG 0
#define NUM_LEDS WIDTH * HEIGHT * SEGMENTS

#define RUNNING_STRING 0
#define CLOCK_MODE 1
#define GAME_MODE 2
#define MADNESS_NOISE 3
#define CLOUD_NOISE 4
#define LAVA_NOISE 5
#define PLASMA_NOISE 6
#define RAINBOW_NOISE 7
#define RAINBOWSTRIPE_NOISE 8
#define ZEBRA_NOISE 9
#define FOREST_NOISE 10
#define OCEAN_NOISE 11
#define SNOW_ROUTINE 12
#define SPARKLES_ROUTINE 13
#define MATRIX_ROUTINE 14
#define STARFALL_ROUTINE 15
#define BALL_ROUTINE 16
#define BALLS_ROUTINE 17
#define RAINBOW_ROUTINE 18
#define RAINBOWDIAGONAL_ROUTINE 19
#define FIRE_ROUTINE 20
#define IMAGE_MODE 21

#if (MCU_TYPE == 1)
#define FASTLED_INTERRUPT_RETRY_COUNT 0
#define FASTLED_ALLOW_INTERRUPTS 0
#include <ESP8266WiFi.h>
#endif

#include «FastLED.h»
CRGB leds[NUM_LEDS];
String runningText = «»;

static const byte maxDim = max(WIDTH, HEIGHT);
byte buttons = 4; // 0 — верх, 1 — право, 2 — низ, 3 — лево, 4 — не нажата
int globalBrightness = BRIGHTNESS;
byte globalSpeed = 200;
uint32_t globalColor = 0x00ff00; // цвет при запуске зелёный
byte breathBrightness;
boolean loadingFlag = true;
byte frameNum;
int gameSpeed = DEMO_GAME_SPEED;
boolean gameDemo = true;
boolean idleState = true; // флаг холостого режима работы
boolean BTcontrol = false; // флаг контроля с блютус. Если false — управление с кнопок
int8_t thisMode = 0;
boolean controlFlag = false;
boolean gamemodeFlag = false;
boolean mazeMode = false;
int effects_speed = D_EFFECT_SPEED;
int8_t hrs = 10, mins = 25, secs;
boolean dotFlag;
byte modeCode; // 0 бегущая, 1 часы, 2 игры, 3 нойс маднесс и далее, 21 гифка или картинка,
boolean fullTextFlag = false;
boolean clockSet = false;

#if (USE_FONTS == 1)
#include «fonts.h»
#endif

uint32_t autoplayTime = ((long)AUTOPLAY_PERIOD * 1000);
uint32_t autoplayTimer;

#include «timerMinim.h»
timerMinim effectTimer(D_EFFECT_SPEED);
timerMinim gameTimer(DEMO_GAME_SPEED);
timerMinim scrollTimer(D_TEXT_SPEED);
timerMinim idleTimer((long)IDLE_TIME * 1000);
timerMinim changeTimer(70);
timerMinim halfsecTimer(500);

#if (USE_CLOCK == 1 && (MCU_TYPE == 0 || MCU_TYPE == 1))
#include <Wire.h>
#include «RTClib.h»

RTC_DS3231 rtc;
// RTC_DS1307 rtc;
#endif

void setup() {
#if (BT_MODE == 1)
Serial.begin(9600);
#endif

#if (MCU_TYPE == 1)
WiFi.setSleepMode(WIFI_NONE_SLEEP);
#endif

#if (USE_CLOCK == 1 && (MCU_TYPE == 0 || MCU_TYPE == 1))
rtc.begin();
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(DATE), F(TIME)));
}
DateTime now = rtc.now();
secs = now.second();
mins = now.minute();
hrs = now.hour();
#endif

// настройки ленты
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(BRIGHTNESS);
if (CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT);
FastLED.clear();
FastLED.show();
randomSeed(analogRead(0) + analogRead(1)); // пинаем генератор случайных чисел
}

void loop() {
customRoutine();
bluetoothRoutine();
}

В PHP скриптах, вызывая include()require()fopen() или их производные, такие как include_oncerequire_once или даже move_uploaded_file(), часто появляются ошибки или предупреждения:

Не удалось открыть поток: нет такого файла или каталога.

 Как быстро найти первопричину проблемы?

Ответ 1

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

Предположим, у нас есть следующая строка:

require «/path/to/file»

Контрольный список

1. Проверьте путь к файлу на предмет опечаток

  • проверьте вручную (визуально проверив путь);

  • переместите все, что вызывается с помощью require* или include* в переменную, скопируйте ее и попробуйте получить к ней доступ с терминала:

$path = «/path/to/file»;

echo «Path : $path»;

require «$path»;

Затем в терминале:

cat <file path pasted>

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

  • если он начинается с косой черты «/», то это относится не к корню папки вашего веб-сайта (корень документа), а к корню вашего сервер:

    • например, каталог вашего веб-сайта может быть /users/tony/htdocs;

  • если он не начинается с косой черты, то он либо полагается на включаемый путь (см. ниже), либо путь является относительным. Если он относительный, то PHP будет его определять относительно пути к текущему рабочему каталогу:

    • не относительно пути к корню вашего веб-сайта или файла;

    • или всегда используйте абсолютные пути к файлам.

Чтобы сделать ваш скрипт надежным на случай, если вы что-то перемещаете, при этом создавая абсолютный путь во время выполнения, у вас есть 2 варианта:

  1. используйте require __DIR__.»/relative/path/from/current/file», который  возвращает каталог текущего файла;

  2. определите SITE_ROOT константу самостоятельно:

    • в корне каталога вашего веб-сайта создайте файл, например, config.php

    • в config.php напишите:

define(‘SITE_ROOT’, __DIR__);

  • в каждом файле, в котором вы хотите сослаться на корневую папку сайта, включите config.php и затем используйте SITE_ROOT константу везде, где хотите:

require_once __DIR__.»/../config.php»;

require_once SITE_ROOT.»/other/file.php»;

Эти действия делают ваше приложение более переносимым, поскольку они не зависят от настроек ini файла.

3. Проверьте свои пути включения

Другой способ включения файлов, ни относительный, ни абсолютный, — это полагаться на путь включения. Это часто бывает с библиотеками или фреймворками, такими как, например, Zend framework.

Подобное включение будет выглядеть так:

include «Zend/Mail/Protocol/Imap.php»

В этом случае вы должны убедиться, что папка, в которой находится «Zend», является частью пути включения.

Это можно проверить с помощью:

echo get_include_path();

Вы можете добавить в него папку с помощью:

set_include_path(get_include_path().»:».»/path/to/new/folder»);

4. Убедитесь, что у вашего сервера есть доступ к этому файлу

Может случиться так, что у пользователя, запускающего серверный процесс (Apache или PHP), просто нет разрешения на чтение или запись в этот файл.

Чтобы проверить, под каким пользователем запущен сервер, можно использовать posix_getpwuid :

$user = posix_getpwuid(posix_geteuid());

var_dump($user);

Чтобы узнать права доступа к файлу, введите в терминале следующую команду:

ls -l <path/to/file>

5. Проверьте настройки PHP

Если ничего из вышеперечисленного не помогло, проблема, вероятно, в том, что некоторые настройки PHP запрещают доступ к этому файлу.

Могут быть актуальны три настройки:

1. open_basedir

    • Если установлено, PHP не сможет получить доступ к любому файлу за пределами указанного каталога (даже через символическую ссылку).

    • По умолчанию не устанавливается, и в этом случае ограничений нет.

    • Можно проверить, вызвав phpinfo() или используя ini_get(«open_basedir»).

    • Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.

2. безопасный режим

    • Если включено, могут быть ограничения. Однако данный режим был удален в PHP 5.4. Если вы все еще используете версию, которая поддерживает безопасный режим, обновитесь до версии PHP, которая это еще поддерживает.

3. allow_url_fopen и allow_url_include

    • Относится только к включению или открытию файлов через сетевой процесс, такой как http://, но не работает для локальной файловой системы.

    • Эти опции можно проверить, используя ini_get(«allow_url_include») или установив с помощью ini_set(«allow_url_include», «1»).

Другие случаи

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

1. Включение библиотеки на основе пути включения

Может случиться так, что вы подключаете библиотеку, например, платформу Zend, используя относительный или абсолютный путь. Например:

require «/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php»

Но по-прежнему получаете такую же ошибку.

Это могло произойти из-за того, что файл, который вы (успешно) включили, сам имеет оператор include для другого файла, и этот второй оператор include предполагает, что вы добавили путь этой библиотеки к пути включения.

Например, упомянутый ранее файл фреймворка Zend может включать следующее:

include «Zend/Mail/Protocol/Exception.php» 

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

В таком случае единственное практическое решение — добавить каталог в ваш путь включения.

2. SELinux

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

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

Чтобы проверить, являются ли политики SELinux причиной проблемы, вы можете попробовать временно отключить ее. Однако будьте ОСТОРОЖНЫ, так как это полностью отключит защиту. Не делайте этого на рабочем сервере.

setenforce0

Если проблема с выключенным SELinux больше не возникает, то это основная причина.

Чтобы решить эту проблему, вам необходимо соответствующим образом настроить SELinux.

Потребуются следующие варианты:

  • httpd_sys_content_t для файлов, которые ваш сервер может читать;

  • httpd_sys_rw_content_t для файлов, к которым необходимо дать доступ для чтения и записи;

  • httpd_log_t для файлов журнала;

  • httpd_cache_t для каталога кэша.

Например, чтобы назначить httpd_sys_content_t к корневому каталогу вашего веб-сайта, выполните:

semanage fcontext -a -t httpd_sys_content_t «/path/to/root(/.*)?»

restorecon -Rv /path/to/root

Если ваш файл находится в домашнем каталоге, вам также необходимо включить httpd_enable_homedirs:

setsebool -P httpd_enable_homedirs 1

В любом случае может быть множество причин, по которым SELinux отказывает в доступе к файлу, в зависимости от ваших политик. Так что вам нужно будет узнать об этом в руководстве по настройке SELinux для веб-сервера.

3. Symfony

Если вы используете Symfony и получаете эту ошибку при загрузке на сервер, возможно, кэш приложения не был сброшен, либо потому, что app/cache был загружен, либо этот кэш не был очищен.

Для этого надо выполнить следующую консольную команду:

cache:clear

4. Внутри Zip-файла символы, отличные от ASCII

По-видимому, эта ошибка может произойти также при вызове zip->close(), когда некоторые файлы внутри zip имеют в своем имени не-ASCII символы, такие как, например, «é».

Потенциальное решение — обернуть имя файла, используя utf8_decode(), перед созданием целевого файла.

Ответ 2

В дополнение к предыдущему ответу:

Программное обеспечение для виртуального хостинга

open_basedir может поставить вас в тупик, потому что его можно указать в конфигурации веб-сервера. Хотя этолегко исправить, если вы запустите свой собственный выделенный сервер, существуют некоторые пакеты программного обеспечения для общего хостинга (например, Plesk, cPanel и т. д.), которые настраивают директиву конфигурации для каждого домена. Поскольку программное обеспечение создает файл конфигурации, вы не можете изменить этот файл напрямую, потому что программное обеспечение хостинга просто перезапишет его при перезапуске.

Plesk предоставляет возможность переопределить предоставленный httpd.conf,вызывая vhost.conf. Только администратор сервера может записать этот файл. Конфигурация для Apache выглядит примерно так:

<Directory /var/www/vhosts/domain.com>

    <IfModule mod_php5.c>

        php_admin_flag engine on

        php_admin_flag safe_mode off

        php_admin_value open_basedir «/var/www/vhosts/domain.com:/tmp:/usr/share/pear:/local/PEAR»

    </IfModule>

</Directory>

Попросите администратора сервера ознакомиться с руководством по используемому им хостингу и программному обеспечению веб-сервера.

Права доступа к файлам

Важно отметить, что выполнение файла через веб-сервер сильно отличается от выполнения задания из командной строки или cron. Разница в том, что у вашего веб-сервера есть собственный пользователь и разрешения. По соображениям безопасности этот пользователь имеет ограничения. Apache, например, часто бывает apachewww-data или httpd (в зависимости от сервера). Задание cron или выполнение CLI имеет все разрешения, которые есть у запускающего его пользователя (т. е. запуск PHP-скрипта от имени root будет выполняться с разрешениями root).

Часто люди решают проблему с разрешениями, выполнив следующие действия (пример Linux):

chmod 777 /path/to/file

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

Что вам нужно сделать, так это определить пользователей, которым требуется доступ, и предоставить доступ только им. Как только вы узнаете, каким пользователям нужен доступ, вы должны убедиться, что:

  1. Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корневым каталогом. 

  2. В Linux хорошей практикой будет использованиеchmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но все могут читать).

Ответ 3

Samba Shares

Если у вас есть тестовый сервер Linux и вы работаете из клиента Windows, общий ресурс Samba мешает команде chmod. Даже если вы используете:

chmod -R 777 myfolder

со стороны Linux вполне возможно, что Unix Groupwww-data все еще не будет иметь доступ на запись. Есть рабочее решение: если ваш общий ресурс настроен так, что администраторы Windows сопоставлены с корневым каталогом в Windows откройте разрешения, отключите наследование для вашей папки с копией, а затем предоставьте полный доступ для www-данных.

Понравилась статья? Поделить с друзьями:
  • Ошибка при открытии fla файла
  • Ошибка при открытии docx в word 2003
  • Ошибка при открытии com порта
  • Ошибка при открытие файла для ворда
  • Ошибка при открытие приложения 0xc0000005