Процесс завершен со статусом 1 в блоках кода

#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 — но принцип остается в силе.