Не удается открыть исходный файл "WProgram.h" в VSCode

header

Я начал печатать этот вопрос, но в процессе создания скриншотов и поиска источников для этого вопроса я нашел ответ :P

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


В чем загвоздка

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

Когда я включаю определенные библиотеки, я получаю закорючки ошибок под включением.

squiggle

В этом случае закорючка появляется из-за ошибки:

не удается открыть исходный файл "WProgram.h" (зависимость от "Adafruit_MPR121.h")C/C++(1696)

WProgram.h error

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

updating the include path

Я провел компьютерный поиск файла WProgram.h, но не смог его найти.

Unable to find header file

Дело в том, что все мои скетчи по-прежнему отлично компилируются и загружаются, так что по большей части я просто могу их игнорировать ... но эта закорючка!!!!!!.

Есть какие-нибудь идеи о том, как я могу это решить?

, 👍0


3 ответа


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, и прокомментировал его.

adjusting the source code

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

pre-compiler conditional

Я назвал этот раздел ответа "Временным исправлением", потому что он включает в себя изменение зависимости от третьей стороны, что обычно не является отличной идеей. Да, сейчас это исправлено, но как только мне понадобится обновить эту библиотеку, это редактирование будет удалено, и мне придется вручную сделать это снова. В этом случае обновление довольно минимальное, так что, возможно, в этом нет ничего страшного, но если бы исправление было более сложным, например, тяжелое редактирование, это было бы настоящей большой болью в заднице и могло бы привести к другим непредвиденным последствиям (а я играл в half-life в детстве, поэтому я знаю, что это не хорошо).

Чем лучше исправить

Обычно я бы сказал, что лучшим решением для этого было бы клонировать исходный репозиторий, исправить его там и выполнить запрос на извлечение, чтобы сама зависимость обновлялась в источнике (если кто-то одобрит и объединит PR).

Но это немного другое, условие там на самом деле в порядке, так как оно добавляет обратную совместимость. Это сделано для того, чтобы библиотека могла поддерживать как версии arduino IDE до 1.0, так и после 1.0. Если бы мы сделали пиар, чтобы вырезать ссылку на WProgram.h, мы бы добавили код взлома для всех, кто работает в более старых версиях.

Итак, лучшее решение-успокоить мой локальный компилятор.

Мы знаем, что заголовок Arduino.h для всех целей и задач совпадает с заголовком WProgram.h, поэтому почти полным решением было бы подделать файл WProgram.h на моем компьютере, чтобы успокоить компилятор.

Faking WProgram.h

Здесь важно отметить, что, чтобы убедиться, что я все сделал правильно, я зашел в репозиторий arduino, прокрутил теги, нашел последний тег, прежде чем они переключились на 1.0+, и нашел файл WProgram.h. Оказавшись там, я воспользовался той же проверкой и определением перед компилятором для заголовка WProgram, чтобы быть уверенным, что я правильно определил имя WProgram.

Correct WProgram define string

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

Это может привести к обратным последствиям, если я включу библиотеку, которая включает только WProgram.h, а не Arduino.h, в условной проверке версии arduino, но это будет на 100% верно для запроса на исправление и извлечение для этой библиотеки.

Резюме

Так что теперь я знаю, что Ардуино.сек файл является причиной того, что я могу скомпилировать все правильно даже с красными цифирками, я обманул WProgram.ч так что мой компилятор сможет найти что-то, когда искал файл и, самое главное, мне больше не придется смотреть на эти красные волнистые линии под себя :)

no squiggles!

Следующий шаг, выясните то же самое для Сэма.h :P

,

Самое простое исправление: создайте 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


4

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


3

Недавно я понял, что это слишком просто. Просто нажмите F1 и найдите это, затем выберите конфигурацию для "Arduino".

(Простите мою бабушку)

,

Просто и эффективно!, @Hauns TM

Мой код VS не имеет конфигурации для Arduino. Есть только Win32. Как получить конфигурацию для Arduino?, @Chandradhar Koneti