Программирование ARM: решение проблем, FAQ no rule to make target Mon, February 26 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

no rule to make target Печать
Добавил(а) microsin   

Сообщение компиляции наподобие "make[1]: *** No rule to make target 'имя_модуля.o', needed by 'output/mcu.elf'" обычно означает отсутствие по какой-то причине модуля исходного кода имя_модуля.c или имя_модуля.cpp.

Пример такой ошибки:

vsp/common/vsp_vpa.o: In function `_DspInitializeCallback':
(.text._DspInitializeCallback+0x20): undefined reference to `printf'
vsp/common/vsp_vpa.o: In function `_DspInitializeCallback':
(.text._DspInitializeCallback+0x20): relocation truncated to fit: R_CKCORE_PCREL_IMM26BY2 against undefined symbol `printf'
vsp/common/vsp_vpa.o: In function `_DspInitializeCallback':
(.text._DspInitializeCallback+0x36): undefined reference to `printf'
vsp/common/vsp_vpa.o: In function `_DspInitializeCallback':
(.text._DspInitializeCallback+0x36): relocation truncated to fit: R_CKCORE_PCREL_IMM26BY2 against undefined symbol `printf'
vsp/common/vsp_vpa.o: In function `_DspInitializeCallback':
(.text._DspInitializeCallback+0x4e): undefined reference to `printf'
vsp/common/vsp_vpa.o: In function `_DspInitializeCallback':
(.text._DspInitializeCallback+0x4e): relocation truncated to fit: R_CKCORE_PCREL_IMM26BY2 against undefined symbol `printf'
make[1]: *** [Makefile:215: output/mcu.elf] Error 1

Сообщение линковщика о том, что не определен символ printf (это может быть и другая функция) означает, что нигде не была определена функция printf, но где-то в коде есть ссылка на неё.

Здесь могут быть два варианта: либо ссылка на printf присутствует в доступном исходном коде, либо ссылка есть в какой-то двоичной библиотеке, для которой нет исходного кода.

[Ссылка на printf в исходном коде]

Это самый частый случай. Если ссылки на printf встречаются в исходном коде, то эти вызовы могут быть просто закомментированы. Или может быть определен макрос, который заменит вызовы printf пустым кодом:

#define printf(x...) while(0)

[Ссылка на printf в двоичной библиотеке]

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

В этом случае необходимо добавить в проект свою реализацию функции. Вот пример такой функции для printf, которая ничего не делает:

int printf(const char *fmt, ...)
{ return 0;
}

 

 

Добавить комментарий


Защитный код
Обновить

Top of Page