Я пытаюсь создать пример проекта для avr atmega328p. И я сталкиваюсь со странной проблемой. У меня следующая структура каталогов.
inc/core/device_support.h
src/main.c
src/core/device_support.c
У меня есть две настройки проекта, одна с использованием make, а другая с использованием cmake. Когда я строю с помощью make все работает нормально. но когда я использую cmake, он не компилируется нормально. (Раздел .text не тот же, если я запускаю avr-size -A myProject.elf
, и он не работает правильно на целевой MCU). Но если я запускаю команду compile вручную в каталоге проекта cmake с каталогом сборки в качестве рабочего каталога, все работает нормально.
Я сузил проблему до того факта, что если мы запускаем команду compile из ядра /home/user/avr/build/core
, она не работает, а если я запускаю команду в /home/user/avr/build
build build, она работает нормально. Я понятия не имею, почему это может происходить.
У меня вопрос, почему в другом каталоге портится компиляция и как я могу это исправить в cmake.
с make у меня есть что-то вроде:
avr-gcc -DARDUINO=10808 -DF_CPU=160000000L -I/home/user/avr/inc/core -mmcu=atmega328p -ffunction-sections -fdata-sections -MMD -flto -std=gnu11 -fno-fat-lto-objects -Os -w -g -MD -MT /home/user/avr/src/core/device_support.c -o /home/user/avr/build/core/device_support.o
и с автоматически созданным скриптом cmake у меня есть:
cd /home/user/avr/build/core && avr-gcc -DARDUINO=10808 -DF_CPU=160000000L -I/home/user/avr/inc/core -mmcu=atmega328p -ffunction-sections -fdata-sections -MMD -flto -std=gnu11 -fno-fat-lto-objects -Os -w -g -MD -MT -o src/CMakeFiles/core.dir/src/core/device_support.o /home/user/avr/src/core/device_support.c
ОБНОВЛЕНИЕ 01:
avr-size -A Вывод myProject.elf (cmake):
section size addr
.data 0 8388864
.text 740 0
.bss 9 8388864
.comment 17 0
.note.gnu.avr.deviceinfo 64 0
.debug_aranges 120 0
.debug_info 3537 0
.debug_abbrev 1965 0
.debug_line 1044 0
.debug_frame 124 0
.debug_str 1175 0
.debug_loc 843 0
.debug_ranges 40 0
Total 9678
avr-size -A Вывод myProject.elf (make):
section size addr
.data 0 8388864
.text 930 0
.bss 9 8388864
.comment 17 0
.note.gnu.avr.deviceinfo 64 0
.debug_aranges 104 0
.debug_info 3559 0
.debug_abbrev 2002 0
.debug_line 1134 0
.debug_frame 180 0
.debug_str 1139 0
.debug_loc 1154 0
.debug_ranges 24 0
Total 10316
Вы можете увидеть разницу в разделе .text. Это простой светодиодный мигающий код Когда я запускаю это на устройстве в случае cmake, светодиодный индикатор иногда горит, а у других выключается. И если я скомпилирую тот же код вручную, выполнив те же команды из вывода cmake, но с каталогом сборки в качестве моего рабочего каталога, то светодиод будет мигать, как и ожидалось.
В любом случае ошибок при сборке нет. Разница лишь в том, что в директории сборки. Если я создаю вручную, и мой рабочий каталог не является сборкой, то и в этом случае он не работает. По какой-то причине важно находиться в каталоге сборки во время компиляции, и я понятия не имею, почему.
Обновление 02:
Пример кода загружен на: https://github.com/systemangle/mcve_avr
Пожалуйста, ознакомьтесь с проектом readme.