#c #embedded
#c #встроенный
Вопрос:
Пока я пытался собрать файлы, в журнале сборки он появился как завершенный процесс со статусом 1. В настоящее время я изучаю atmega328p и использовал его для этого проекта (horn system), и у меня здесь есть весь код hornsystem. Кто-нибудь может мне помочь, и это журнал сборки.
------------- Build: Debug in casestudy (compiler: GNU GCC Compiler for AVR)---------------
avr-gcc.exe -LC:WinAVRavrlib -o binDebugcasestudy.elf objDebugfuse.o objDebugGPIO.o objDebugHornstate.o objDebugmain.o objDebugmodes.o
objDebugtemperature.o -mmcu=atmega328p -Wl,-Map=binDebugcasestudy.map,--cref
objDebugHornstate.o:(.data 0x0): multiple definition of `default_dutycycle'
objDebugGPIO.o:(.data 0x0): first defined here
objDebugmain.o:(.data 0x0): multiple definition of `default_dutycycle'
objDebugGPIO.o:(.data 0x0): first defined here
objDebugmodes.o:(.data 0x0): multiple definition of `default_dutycycle'
objDebugGPIO.o:(.data 0x0): first defined here
objDebugtemperature.o:(.data 0x0): multiple definition of `default_dutycycle'
objDebugGPIO.o:(.data 0x0): first defined here
Process terminated with status 1 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Комментарии:
1. Ошибка гласит «множественное определение
default_dutycycle
» и сообщает вам файлы, в которых оно было определено. В файлеGPIO.h
, который у вас естьunsigned int default_dutycycle = 77;
, и этот заголовок был включен несколькими другими файлами. Лучше не определять переменные или функции в файлах заголовков: только их объявления.2. Спасибо за информацию, ошибка решена. Я думал, поскольку я использовал
ifndef
,unsigned int default_dutycycle
не будет определяться каждый разmain.c
.3.
#ifndef
поскольку «защита заголовка» предназначена для защиты от циклического включения, а не включения в несколько блоков компиляции.4. Добро пожаловать в stackoverflow. Если вы нашли решение своей проблемы, было бы очень полезно, если бы вы описали его в ответе, а затем приняли этот ответ — это помогло бы другим пользователям с аналогичной проблемой быстрее найти решение. Если бы я мог также предложить отредактировать ваш вопрос, чтобы было понятнее, что вы пытаетесь сделать — например, что вы пытаетесь построить и на чем вы пытаетесь его построить, это также может помочь другим пользователям идентифицировать вашу проблему как такую же, как у них. Приветствия.
5. Не ссылайтесь на сторонний код. Включите соответствующий код в вопрос.
Ответ №1:
Читайте (и исправляйте) журналы сборки сверху, а не снизу. Ошибка, на которую вы ссылаетесь, просто означает, что сборка завершилась неудачно. Причина сбоя описана ранее.
Завершившийся процесс, я полагаю, является разработчиком проекта ( make
скорее всего). make
(или какая бы ни была система сборки) завершается, когда сборка либо завершена, либо завершается сбоем.
Здесь этап компоновки сборки завершается неудачно по причинам, указанным в предыдущих строках. Фактическая ошибка:
objDebugHornstate.o:(.data 0x0): multiple definition of `default_dutycycle'
Последующие строки сообщают вам, где находятся несколько определений mde: main.o, GPIO.o, Hornstate.o, modes.o и temperature.o.
Скорее всего, у вас есть заголовочный файл, включенный во все эти файлы, который содержит определение, в котором оно должно содержать только объявление. Например, если у вас есть файл temperature.h с:
int default_dutycycle = 50 ;
Это определение и будет дублироваться в каждом источнике, который включает temperature.h. Вместо этого temperature.h должен содержать:
extern int default_dutycycle ;
В этом случае temperature.c может содержать:
int default_dutycycle = 50 ;
Альтернативный вариант, если default_dutycycle
это константа, заключается в том, что вы определяете ее как макрос в заголовочном файле:
#define default_dutycycle 50
Хотя соглашение будет диктовать капитализацию:
#define DEFAULT_DUTYCYCLE 50
Комментарии:
1. Обратите внимание, что я не следовал ссылке за пределами сайта на фактический код в вопросе — и не собираюсь. Следовательно, ответ включает предположения о том, что содержит код. Комментарии от тех, кто смотрел на него, предполагают, что символ находится в GPIO.h, а не в temperature.h — но принцип остается в силе.