Использование внешнего заголовочного файла
У меня есть проект, который является частью более крупного репозитория и использует общие файлы заголовков с программами, не написанными на языке C на языке Arduino.
Я знаю, что эти заголовки можно использовать, скопировав их в папку библиотек или папку скетча, но я бы предпочел использовать их с относительным путем (что, похоже, не работает), чтобы избежать копирования файлов для каждого клона или обновления репозитория.
Есть ли решение, не связанное с перемещением/копированием файла заголовка?
ИЗМЕНИТЬ: Хотя полного решения этого вопроса нет, С тех пор я обнаружил, что с помощью PlatformIO Вместо этого IDE решает проблему.
@Photon, 👍4
Обсуждение3 ответа
Лучший ответ:
Вы можете использовать файлы заголовков с абсолютным именем, например:
#include "c:\Temp\x.h"
Еще один способ, который может помочь, – сделать путь включения следующим образом:
#include "q:\x.h"
И используйте Windows, чтобы сопоставить букву Q драйвера с нужным вам путем.
Я думаю, это лучше, чем ничего, но требует, чтобы репозиторий был клонирован в определенное место или каждый раз менялся код., @Photon
@Photon ... Я попытался использовать определение внутри пути включения, чтобы сделать эту переменную пути, но, похоже, это не работает. Я добавил другое решение (сопоставление буквы диска). Тогда вам нужно только одно изменение., @Michel Keijzers
Спасибо. Я отмечу это как ответ, потому что он обеспечивает лучшее, что можно сделать в условиях ограничений IDE., @Photon
Спасибо; и да, похоже на ограничение IDE., @Michel Keijzers
Я пытался сделать это и изучил это несколько лет назад, но, похоже, невозможно сделать то, что вы хотите. У этого парня была та же проблема, оператор #include с относительным путем.
Похоже, сработает либо предложение Мишеля, либо их копирование (что трудно) с Можно ли включить заголовочный файл, который не является библиотекой?:
Если включаемый файл является частью одного скетча, инструкции здесь... http://www.arduino.cc/en/Hacking/BuildProcess [ новый ссылка]
Если включаемый файл предназначен для совместного использования несколькими скетчами, то...
- Закройте IDE Arduino
- Перейдите в каталог
{Arduino}\hardware\libraries
- Создайте подкаталог. Я предлагаю что-то вроде
MyCommon
.- В новом подкаталоге создайте файл заголовка. Я предлагаю что-то вроде
MyCommon.h
.- Откройте новый файл заголовка, отредактируйте его по своему усмотрению и сохраните.
- Откройте IDE Arduino
- Создайте или откройте скетч
- Добавьте
#include
вверху скетча, который ссылается на ваш новый включаемый файл.
Поэтому почему относительные пути не поддерживаются, из Re: как включить заголовочный файл из предыдущей папки?
Включить подробный режим при компиляции. Перейдите к файлу Testing.cpp, созданному из файла Testing .ino. Поднимитесь на один уровень. Вы видите файлы, которые пытаетесь включить?
и из Re: как включить заголовочный файл из предыдущей папки? (выделено мой)
Причина, по которой вы идете смотреть на что-то папка вроде/AppData/Local/Temp/build/sketch была чтобы вы подумали о том, что делает процесс сборки, и, возможно, думаю, вы могли бы погуглить Arduino + Build, чтобы получить более подробную информацию.
Среда IDE копирует ваш скетч и добавляет #included в ваш скетч в каталог сборки.
Если вы #include , файл header.h и все остальное в каталог, в котором он находится, также будет скопирован в каталог сборки.
Если вы #include "header.h", файл header.h и все остальное в каталог, в котором он находится, также будет скопирован в каталог сборки.
Разница между <> и "" заключается в том, где просматривается файл header.h. для. "" ищет в текущем каталоге. <> ищет в библиотеке каталоги.
Если токен между <> или "" не найден в соответствующем папка, вам об этом не говорят; однако ничего не копируется.
Но это объясняет, почему относительные имена бесполезны. Каталог скетчей может содержать файл с именем header.h. Он не будет содержать файл называется ..\header.h, потому что ..\header НЕ является допустимым именем файла.
Обратите внимание: я НЕ говорил, что ..\header.h не является допустимым ИМЯ. Я сказал что это недопустимое ИМЯ ФАЙЛА.
Возможны только имена файлов между <> или "", насколько это возможно в среде IDE. обеспокоен.
Если вам это не нравится, вы можете не использовать IDE.
Наконец из Re: Как указать путь к конкретному заголовочному файлу?
У системы Arduino есть некоторые серьезные ограничения в ее способности разумно работать с файловой системой — это может быть настоящим PITA.
Кстати, если вы создаете несколько библиотек в папке libraries, вы можете использовать относительный путь ссылки, то есть во всех файлах заголовков вы можете использовать #include "..\mylib2\xxxx.h
.
- устаревшее преобразование из строковой константы в 'char*'
- Как запрограммировать ардуино на чистом C/C++?
- Количество элементов в массиве char
- Регистры ввода-вывода SAM3X8E (Arduino Due)
- как быстро loop() работает в Arduino
- Arduino: как получить тип платы в коде
- Как вызвать функции C из скетча ардуино?
- Как преобразовать полезную нагрузку byte* в строку
может симлинки?, @Edgar Bonet
Я пробовал это с помощью cygwin на окнах. IDE это не понравилось., @Photon
Я использую ссылки. Я связываю папку с папкой библиотеки.
mklink
в Windows, @Juraj