Не удается открыть исходный файл "WProgram.h" в VSCode
Я начал печатать этот вопрос, но в процессе создания скриншотов и поиска источников для этого вопроса я нашел ответ :P
Тем не менее, эта проблема была для меня проблемой в течение некоторого времени, и я спрашивал об этом нескольких людей, но не нашел решения. Поскольку это казалось мне довольно сложным, и я не видел многих хорошо объясненных причин, я решил закончить этот пост здесь, чтобы помочь всем, кто сталкивается с этим или столкнется с этим в будущем.
В чем загвоздка
Я использую vscode в качестве редактора, и у меня какое-то время была эта проблема, но она, наконец, сводит меня с ума настолько, что я прошу о помощи.
Когда я включаю определенные библиотеки, я получаю закорючки ошибок под включением.
В этом случае закорючка появляется из-за ошибки:
не удается открыть исходный файл "WProgram.h" (зависимость от "Adafruit_MPR121.h")C/C++(1696)
Сначала я подумал, что загвоздка в том, что мой путь включения нуждался в каталоге библиотек arduino, поэтому я добавил его для проекта, но я все равно получаю загвоздку.
Я провел компьютерный поиск файла WProgram.h
, но не смог его найти.
Дело в том, что все мои скетчи по-прежнему отлично компилируются и загружаются, так что по большей части я просто могу их игнорировать ... но эта закорючка!!!!!!.
Есть какие-нибудь идеи о том, как я могу это решить?
@Chris Schmitz, 👍0
3 ответа
Ответ
Как я уже сказал в вопросе, я нашел ответ после некоторого поиска при вводе самого вопроса, и я хочу объяснить это для будущих ненавистников закорючек :)
WProgram.h против Arduino.h
Я провел кучу поисков, чтобы попытаться отследить, что происходит, и в конце концов нашел этот полезный (и, в зависимости от достоверности источника, довольно грустный) кусочек истории:
Существует история проекта arduino, о которой не все знали или должны были знать. Я только вот что: все это началось с какого-то аспиранта(ов), который создал платформу проводки и IDE, называемую монтажной платой и проводкой "язык программирования". Этот проект все еще активен среди активных пользователей, таких как проект arduino. Затем люди из arduino решили создать проект arduino на основе проекта проводки, поэтому они взяли IDE для проводки (которая была взята из оригинальной среды разработки), Включая все библиотеки и т. Д., И создали первую плату Arduino (немного отличающуюся от платы проводки, дешевле!), названную arduino. Проект Arduino не очень положительно признал проект проводки в качестве источника своего проекта, и люди, занимающиеся проводкой, восприняли его не очень хорошо.
Теперь эта программа WProgram.h представляет собой файл определения, созданный и для проекта подключения и платы. Вот почему на нем есть буква "W". Он был в Arduino IDE с самого начала и был заменен Arduino.h только недавно, когда был выпущен Arduino 1.0. Теперь все Arduino 1.0+ IDE будут использовать Arduino.h, а не WProgram.h поэтому, если у вас есть это плюс некоторые другие старые вещи, вам придется внести изменения для работы с Arduino 1.0+ IDE.
Временное исправление
Имея это в виду, я заглянул в исходный файл библиотеки Adafruit_MPR121.h
, нашел, где он содержит файл заголовка WProgram.h
, и прокомментировал его.
Также стоит отметить, что условие предварительного компилятора здесь поддерживает переименование файла в более новых версиях Arduino.
Я назвал этот раздел ответа "Временным исправлением", потому что он включает в себя изменение зависимости от третьей стороны, что обычно не является отличной идеей. Да, сейчас это исправлено, но как только мне понадобится обновить эту библиотеку, это редактирование будет удалено, и мне придется вручную сделать это снова. В этом случае обновление довольно минимальное, так что, возможно, в этом нет ничего страшного, но если бы исправление было более сложным, например, тяжелое редактирование, это было бы настоящей большой болью в заднице и могло бы привести к другим непредвиденным последствиям (а я играл в half-life в детстве, поэтому я знаю, что это не хорошо).
Чем лучше исправить
Обычно я бы сказал, что лучшим решением для этого было бы клонировать исходный репозиторий, исправить его там и выполнить запрос на извлечение, чтобы сама зависимость обновлялась в источнике (если кто-то одобрит и объединит PR).
Но это немного другое, условие там на самом деле в порядке, так как оно добавляет обратную совместимость. Это сделано для того, чтобы библиотека могла поддерживать как версии arduino IDE до 1.0, так и после 1.0. Если бы мы сделали пиар, чтобы вырезать ссылку на WProgram.h
, мы бы добавили код взлома для всех, кто работает в более старых версиях.
Итак, лучшее решение-успокоить мой локальный компилятор.
Мы знаем, что заголовок Arduino.h
для всех целей и задач совпадает с заголовком WProgram.h
, поэтому почти полным решением было бы подделать файл WProgram.h
на моем компьютере, чтобы успокоить компилятор.
Здесь важно отметить, что, чтобы убедиться, что я все сделал правильно, я зашел в репозиторий arduino, прокрутил теги, нашел последний тег, прежде чем они переключились на 1.0+, и нашел файл WProgram.h. Оказавшись там, я воспользовался той же проверкой и определением перед компилятором для заголовка WProgram, чтобы быть уверенным, что я правильно определил
имя WProgram.
Это кажется немного излишним, потому что это защищает меня от включения других заголовков с той же определенной строкой, но если бы это произошло, это было бы потому, что у меня все равно есть файл WProgram, но я решил, что если бы я собирался подделать его, я бы сделал это правильно.
Это может привести к обратным последствиям, если я включу библиотеку, которая включает только WProgram.h
, а не Arduino.h
, в условной проверке версии arduino, но это будет на 100% верно для запроса на исправление и извлечение для этой библиотеки.
Резюме
Так что теперь я знаю, что Ардуино.сек
файл является причиной того, что я могу скомпилировать все правильно даже с красными цифирками, я обманул WProgram.ч
так что мой компилятор сможет найти что-то, когда искал файл и, самое главное, мне больше не придется смотреть на эти красные волнистые линии под себя :)
Следующий шаг, выясните то же самое для Сэма.h
:P
Я приземлился здесь в том же положении, что и вы, и, изучив комментарии с упоминанием-DARDUINO=10813
и еще немного погуглив, я нашел: https://github.com/microsoft/vscode-arduino/issues/1148
Это привело меня к добавлению еще одной строки для определения
в моем c_cpp_properties.json
и это также убрало закорючку!
{
"configurations": [
{
...
"defines": [
"USBCON",
"ARDUINO=10813"
],
...
}
],
}```
Просто потому, что это не отвечает _ почему это работает: версии Arduino <1.0 used WProgram.h, but Arduino >=1.0 используют Arduino.h. Как объяснил @Chris Schmitz, многие библиотеки используют проверку, чтобы определить, какие из них загружать для обратной совместимости. Поскольку расширение VSCode должно быть обновлено, мы можем использовать (текущую) последнюю версию 1.8.13 или 10813, как это определено в коде. Добавление этого в VSCode позволяет пакетам, проверяющим версии, видеть, что мы запускаем современные версии., @IronSean
Недавно я понял, что это слишком просто. Просто нажмите F1 и найдите это, затем выберите конфигурацию для "Arduino".
(Простите мою бабушку)
Просто и эффективно!, @Hauns TM
Мой код VS не имеет конфигурации для Arduino. Есть только Win32. Как получить конфигурацию для Arduino?, @Chandradhar Koneti
- Ошибка: Переменная или поле объявлены недействительными
- Использование функций в заголовочных файлах
- Установка pinmode() в заголовочном файле
- В чем логика Arduino, встраивающая `HardwareSerial::_rx_complete_irq()` для получения последовательных данных (но НЕ `_tx_udr_empty_irq()`)?
- Как называются шаблоны битов, отправляемых на контакты GPIO или считываемых с них?
- Разбить большой файл на более мелкие файлы
- Странное поведение defines - специфично ли это для Arduino и как оно работает?
Самое простое исправление: создайте WProgram.h и поместите в него " #включить <Arduino.h>`., @Majenko
Ах, это хороший момент, хотя я чувствую, что столкнусь с той же проблемой изменения кода, который можно было бы перезаписать, если бы я вставил его в Arduino.h`, а затем обновление среды разработки arduino изменяет этот файл., @Chris Schmitz
platformio не определяет версию Arduino? вы можете добавить-DARDUINO=150 где-нибудь в свойствах проектов?, @Juraj
Если вы хотите быть совместимыми с экосистемой Arduino, правильным решением было бы использовать те же макросы препроцессора, что и сама среда разработки Arduino. Например, Arduino 1.8.13 компилирует каждый файл с параметром командной строки
-DARDUINO=10813
., @Edgar BonetО, интересно, я не знал о макросах препроцессора! Я только что провел несколько поисков в документах arduino, но не могу найти, где об этом говорится. Может ли кто-нибудь указать мне нужное место в документах? Если я выясню, как добавить это на стороне vscode, я обновлю свой ответ., @Chris Schmitz
https://arduino.github.io/arduino-cli/platform-specification/#global-predefined-properties, @Juraj
Ах, потрясающе, спасибо за замечание :хлопайте:, @Chris Schmitz
Если бы вы использовали бесплатную версию IntelliJ Idea, вы могли бы просто щелкнуть правой кнопкой мыши на предупреждении (красная закорючка) и сообщить IDE, что все в порядке. IntelliJ запомнил бы это и больше не беспокоил бы вас по этому поводу. (IntelliJ поддерживает большинство распространенных языков программирования, включая C и C++, python и javascript, а также Java)., @Software Engineer