проблема сборки cmake при сборке кода для avr - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь создать пример проекта для 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.

1 Ответ

0 голосов
/ 19 марта 2019

По какой-то причине важно находиться в каталоге сборки во время компиляции, и я понятия не имею, почему

Тогда у вас, вероятно, уже есть ответ. Проблема, похоже, не связана с CMake. Может быть, вы можете попробовать встроенную сборку с помощью cmake и посмотреть, что произойдет. В противном случае, если вы хотите имитировать рукописное поведение Makefile, вы можете избежать использования любого add_subdirectory и писать только большой жирный CMakeLists.txt в корне вашего проекта.

Все это говорит о том, что если выходные данные компиляции различаются в зависимости от , где вы находитесь, когда вызывается компилятор, тогда я думаю, что вам лучше задать вопрос людям, предоставляющим кросс-компилятор, об этом странном поведении.

Вы пытались вручную скомпилировать файл, находясь в другом каталоге? Изменит ли это объектный файл?

...