Множественная ошибка определения, ошибка компоновщика

Попытка создать файл elf для двух наборов файлов в разных папках.

LIDARBOT.h
-----------
#ifndef LIDARBOT_H_
#define LIDARBOT_H_

#include <avr/io.h>
#include "drivers/motors.h"

#endif

LIDARBOT.C
----------
#include "LIDARBOT.h"
int main(){
  pwmtimersetup();
    while (1) {
    }
}

motors.h
--------
#ifndef MOTORS_H_
#define MOTORS_H_

#include <avr/io.h>

void pwmtimersetup(void);

#endif

motors.c
--------
#include <avr/io.h>
#include "motors.h"

void pwmtimersetup(void){
  // Прескаляр таймера для ~490 Гц равен 8
  TCCR0B &= ~((1<<CS02)||(1<<CS00));
  TCCR0B |=  (1<<CS01);
  // Установите режим сравнения вывода на переключение ШИМ
  TCCR0A &= ~(1<<COM0A1);
  TCCR0A |=  (1<<COM0A0);
  // Режим генерации сигнала: WGM02 = 1, WGM01 = 1, WGM00 = 1
  TCCR0B |= (1<<WGM02);
  TCCR0A |= (1<<WGM01)||(1<<WGM00);
  OCR0A = 125;
  DDRD |= (1<<DDD4)||(1<<DDD2);
  PORTD |= (1<<PORTD4);
  PORTD &= (1<<PORTD2);
}

Я могу создать объединенный объектный файл, но не файл elf для загрузки на плату. Вывод ниже:

avr-gcc -g -Os -Wall -Werror -Wextra  -mmcu=atmega328p -DF_CPU=1000000UL -Wa,-ahlmns=LIDARBOT.lst -o objects/LIDARBOT.o \
source/LIDARBOT.c \
source/drivers/motors.c \
-I/home/manu/C/Arduino/LIDARBOT/libraries/

avr-gcc -g -Os -Wall -Werror -Wextra -mmcu=atmega328p -DF_CPU=1000000UL -o elf/LIDARBOT.elf objects/LIDARBOT.o
objects/LIDARBOT.o: In function `__vector_22':
(.text+0x7c): multiple definition of `__bad_interrupt'
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega328p.o:(.text+0x0): first defined here
objects/LIDARBOT.o: In function `__vectors':
(.text+0x0): multiple definition of `__vectors'
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtatmega328p.o:(.vectors+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:191: elf] Error 1

Я немного растерялся. В чем здесь может быть моя ошибка? Если я увижу такую ошибку, как мне начать отладку?

, 👍1

Обсуждение

Я понял, что мне не нужно добавлять #include <avr/io.h> в файл motors.c. Я удалил это и попробовал еще раз. Та же ошибка., @Ravindra Manu

Что именно вы пытаетесь сделать с помощью первой командной строки avr-gcc? В этой командной строке я вижу несколько исходных файлов, только один выходной файл и нет -c? Это похоже на полную компиляцию и компоновку, но с сохранением результирующего эльфа в виде файла .o. Но почему? Что мне не хватает?, @AnT


2 ответа


2

Вы забыли указать флаг -c для своей первой команды. Это означает, что вы сначала скомпилировали свою программу в полноценный файл elf. Затем вы пытаетесь снова связать этот файл elf со стандартными библиотеками запуска (они уже содержат их) в другой новый файл elf.

Поэтому вы получаете в нем повторяющиеся записи.

Добавьте -c к своей первой команде, что означает "только компилировать, не связывать", чтобы создавать объектные файлы, а не файлы elf.

,

0

Спасибо, ребята, за ваш вклад, AnT и Majenko. Я понял свою проблему, которая заключалась в том, чтобы связать файл .o с другим. Поэтому я исправил свой make-файл, скомпилировав его по отдельности, но не связывая исходные файлы с параметром -c. Затем я сделал свой окончательный файл эльфа, используя несвязанные файлы .o.

,