Множественная ошибка определения, ошибка компоновщика
Попытка создать файл 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
Я немного растерялся. В чем здесь может быть моя ошибка? Если я увижу такую ошибку, как мне начать отладку?
@Ravindra Manu, 👍1
Обсуждение2 ответа
Вы забыли указать флаг -c для своей первой команды. Это означает, что вы сначала скомпилировали свою программу в полноценный файл elf. Затем вы пытаетесь снова связать этот файл elf со стандартными библиотеками запуска (они уже содержат их) в другой новый файл elf.
Поэтому вы получаете в нем повторяющиеся записи.
Добавьте -c к своей первой команде, что означает "только компилировать, не связывать", чтобы создавать объектные файлы, а не файлы elf.
Спасибо, ребята, за ваш вклад, AnT и Majenko. Я понял свою проблему, которая заключалась в том, чтобы связать файл .o с другим. Поэтому я исправил свой make-файл, скомпилировав его по отдельности, но не связывая исходные файлы с параметром -c. Затем я сделал свой окончательный файл эльфа, используя несвязанные файлы .o.
- Как вызвать функции C из скетча ардуино?
- max7219 связанный дисплей, показывающий зеркальный текст
- Пиринговая коммуникация
- Запуск С для ардуино
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Прерывание ардуино при смене контакта
- avr/io.h ошибка "No such file or directory" при компиляции с использованием avr-gcc
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
Я понял, что мне не нужно добавлять #include <avr/io.h> в файл motors.c. Я удалил это и попробовал еще раз. Та же ошибка., @Ravindra Manu
Что именно вы пытаетесь сделать с помощью первой командной строки avr-gcc? В этой командной строке я вижу несколько исходных файлов, только один выходной файл и нет
-c
? Это похоже на полную компиляцию и компоновку, но с сохранением результирующего эльфа в виде файла.o
. Но почему? Что мне не хватает?, @AnT