Сообщение компиляции наподобие "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; }
|