Как включить файл из другого (родительского) каталога

c makefile arduino-makefile

Это моя структура

program/
  src/
    Makefile
    main.ino
    test.h
    ...
  lib/
    i2c.h

В main.ino я включаю test.h, а в test.h я пытаюсь включить i2c.h, но это просто не работает, я продолжаю получать:

make: *** No rule to make target 'i2c.h', needed by 'build-uno/main.ino.o'.  Stop.

Я пробовал в том числе и так

// test.h
#include "../lib/i2c.h"

Я также попытался создать символическую ссылку на мою папку lib в библиотеках arduino и добавить ее в качестве библиотеки в Makefile

sudo ln -s /home/pi/program/lib /usr/share/arduino/ библиотеки/GAVR

# Makefile
ARDUINO_DIR = /usr/share/arduino
BOARD_TAG = uno
ARDUINO_PORT = /dev/ttyAMA0
ARDUINO_LIBS = GAVR
include /usr/share/arduino/Arduino.mk

Я также попытался создать символическую ссылку на lib внутри каталога src

ln -s /главная страница/pi/program/библиотека /главная страница/pi/program/src/библиотека

Ничто из вышеперечисленного не возымело никакого эффекта, сообщение об ошибке остается прежним.

Как я могу включить файл из другого каталога в свою программу?

, 👍0

Обсуждение

Это ошибка make, а не ошибка компиляции. Если у вас есть правило для main.ino, где этот файл i2c.h указан как dependency и находится не в том же каталоге, он завершится неудачей. Зависит от каталога Makefile, это может быть ../lib/i2c.h (или вы можете отключить эту зависимость, но если она изменится, она не будет перекомпилирована), @KIIV

@KIIV Я все еще новичок в c, и я действительно не знаю, что я делаю. Мой Makefile находится в каталоге src, и я опубликовал его содержимое. Я не знаю, как я должен указывать каталог lib как часть процесса сборки. Я нашел много примеров, в которых предлагается добавить -I в gcc, но arduino makefile творит чудеса, и я не знаю, как добавить параметры в команду компилятора., @php_nub_qq

Я использовал platformio (так как тогда не было интерфейса командной строки). 1. библиотеки обычно находятся в собственном подкаталоге, поэтому может потребоваться что-то вроде lib/i2c_lib/i2c.h и ARDUINO_LIBS=/home/pi/program/lib, @KIIV

Если вы не знаете, что вы делаете с Makefile (а Makefile - это черная магия), то вам действительно не следует его использовать. Если вы должны использовать командную строку, то вместо этого используйте ardiuno-cli. Также имейте в виду, что сборка обычно выполняется не в исходном каталоге, а в отдельном каталоге сборки в другом месте., @Majenko

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

Вы можете столкнуться с той же проблемой с arduino-cli из-за того, как выполняется сборка Arduino - не в исходном каталоге. Вам нужно будет определить, каков путь к каталогу сборки относительно того, где находится ваш файл. Однако, если вы используете правильную библиотеку, то "arduino-cli" будет знать это и справится со всем этим за вас., @Majenko

@Majenko Кажется, я нашел решение, следуя символической ссылке на / usr / share / arduino / libraries / GAVR, мне просто нужно было создать файл GAVR.h, который включает в себя другие мои файлы. Это, вероятно, заставило бы настоящего программиста на C съежиться, но для меня это работает, поэтому я не уверен, следует ли мне использовать это в качестве ответа или вообще удалить вопрос., @php_nub_qq

Сформулируйте это как ответ. Это может кому-то помочь. И эй, если это сработает, то сработает. В C существует больше мнений, чем правильных и неправильных., @Majenko


1 ответ


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

1

Это определенно халтурно и не является правильным решением проблемы, но, тем не менее, это работает, поэтому я делюсь этим.

После создания символической ссылки в каталоге /usr/share/arduino/ libraries вы должны убедиться, что существует файл заголовка с точным именем каталога, по-видимому, именно так настроен arduino для их включения.

В моем случае моя символическая ссылка была названа GAVR, поэтому мне пришлось создать файл GAVR.h внутри моего каталога lib, который затем включал бы мой файл i2c.h и, возможно, любой другой файл, который мне понадобится.

Также в test.h или в любом другом месте, где мне нужно использовать i2c.h, я должен включить <GAVR.h> вместо этого.
Оказывается, также 1 равно false , вам просто нужно включить <GAVR.h> один раз в файл .ino, и его элементы будут доступны везде, как и любая другая библиотека.

Также 2, теперь, когда ARDUINO_LIBS не является пустым в Makefile, вам нужно будет вручную объявить все библиотеки, которые использует ваш код.

,