Использование внешнего заголовочного файла

c

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

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

Есть ли решение, не связанное с перемещением/копированием файла заголовка?

ИЗМЕНИТЬ: Хотя полного решения этого вопроса нет, С тех пор я обнаружил, что с помощью PlatformIO Вместо этого IDE решает проблему.

, 👍4

Обсуждение

может симлинки?, @Edgar Bonet

Я пробовал это с помощью cygwin на окнах. IDE это не понравилось., @Photon

Я использую ссылки. Я связываю папку с папкой библиотеки. mklink в Windows, @Juraj


3 ответа


Лучший ответ:

4

Вы можете использовать файлы заголовков с абсолютным именем, например:

#include "c:\Temp\x.h"

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

#include "q:\x.h"

И используйте Windows, чтобы сопоставить букву Q драйвера с нужным вам путем.

,

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

@Photon ... Я попытался использовать определение внутри пути включения, чтобы сделать эту переменную пути, но, похоже, это не работает. Я добавил другое решение (сопоставление буквы диска). Тогда вам нужно только одно изменение., @Michel Keijzers

Спасибо. Я отмечу это как ответ, потому что он обеспечивает лучшее, что можно сделать в условиях ограничений IDE., @Photon

Спасибо; и да, похоже на ограничение IDE., @Michel Keijzers


3

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

,

0

Кстати, если вы создаете несколько библиотек в папке libraries, вы можете использовать относительный путь ссылки, то есть во всех файлах заголовков вы можете использовать #include "..\mylib2\xxxx.h .

,