Код AVR C компилируется успешно, но в arduino ide выдает ошибку об отсутствующих функциях

поэтому я пытаюсь вызвать функцию c в файле c в arduino uno.

с помощью команды gcc-avr он успешно компилируется:

sudo avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o nrf nrf.c

но в Arduino IDE выдает ошибку об отсутствующих функциях, которые вызывает nrf.c и которые существуют в других файлах c. так как это исправить?

.ino-файл

#include "nrf.c"

extern "C" // these functions does not exist in c file they are in a .s file
{
    void init_serial();
    void print_msg();
    void light();
}
//----------------------------------------------------
void setup()
{
}

void loop(){
    nrf_start1();
    light();
}

это вывод Arduino IDE:

/tmp/arduino/sketches/8589FEB308F7EAA6CFEF4682C1500C77/sketch/sketch_jul11a.ino.cpp.o (symbol from plugin): In function `nrf_start1()':
(.text+0x0): multiple definition of `__vector_1'
/tmp/arduino/sketches/8589FEB308F7EAA6CFEF4682C1500C77/sketch/nrf.c.o (symbol from plugin):(.text+0x0): first defined here
/tmp/arduino/sketches/8589FEB308F7EAA6CFEF4682C1500C77/sketch/sketch_jul11a.ino.cpp.o (symbol from plugin): In function `nrf_start1()':
(.text+0x0): multiple definition of `message_received'
/tmp/arduino/sketches/8589FEB308F7EAA6CFEF4682C1500C77/sketch/nrf.c.o (symbol from plugin):(.text+0x0): first defined here
/tmp/arduino/sketches/8589FEB308F7EAA6CFEF4682C1500C77/sketch/sketch_jul11a.ino.cpp.o (symbol from plugin): In function `nrf_start1()':
(.text+0x0): multiple definition of `status'

я пытался вызвать скомпилированный, используя extern c, но это не сработало

Размещайте код непосредственно в вопросе, а не в сторонних ссылках. Опубликуйте сообщение об ошибке или заполните журнал сборки. Вы опубликовали только команду сборки для успешной сборки, которая не сообщает нам ничего полезного.

Clifford 15.07.2024 21:57
#include "nrf.c"- если вы точно не знаете, что делаете, и у вас нет для этого веской причины, это почти наверняка неправильно.
UnholySheep 15.07.2024 22:13

@Clifford Это не была «команда сборки для успешной сборки». Это команда компиляции для успешной компиляции.

tofro 15.07.2024 23:25

@tofro - Даже если бы это было так, это не меняет проблемы: это бесполезная информация. Однако -o nrf делает это компиляцией и ссылкой.

Clifford 15.07.2024 23:43

Нет. Параметр "-c" указывает gcc только на компиляцию. В этом случае «-o» только меняет имя выходного (объектного) файла на что-то вводящее в заблуждение. Предположение ОП о том, что сборка gcc прошла успешно, неверно.

tofro 15.07.2024 23:47

@tofro, ок, пропустил это при узком обзоре моего телефона. Дело все еще остается в силе. Но редактирование показывает, что это в любом случае небольшая ошибка компоновщика, поэтому он все равно компилируется в Arduino.

Clifford 15.07.2024 23:50

@Clifford Да, это явно сбой связи. GCC вообще не пытался установить связь, поэтому сбоя здесь не было.

tofro 15.07.2024 23:52

@tofro исходная ссылка на GitHub была на код, включающий main(), так что это явно не тот код, о котором идет речь.

Clifford 16.07.2024 00:00

Теперь вы вообще опустили код nrf.c. Должен быть и сам код. Не код, похожий на код, о котором вы спрашиваете. Также в сообщениях об ошибках ничего не говорится об «отсутствующих функциях», как вы сказали.

Clifford 16.07.2024 00:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из сообщений об ошибках компоновщика и кода. Понятно, что вы как включили nrf.c, так и отдельно его скомпилировали и скомпоновали. Я думаю, что Arduino IDE автоматически делает это, просто добавляя исходный код в скетч.

Ответ принят как подходящий
  1. Никогда (никогда) не используйте файлы .c. Это неправильно в 99,9% случаев
  2. Вам нужно сообщить Arduino IDE, что ваш скетч содержит больше файлов, чем один .ino. Вы делаете это, копируя файл «nrf.c» туда, где находится ваш эскиз, и используете «Эскиз» -> «Добавить файл...». Теперь Arduino IDE должна знать, что ваш Sketch состоит из нескольких файлов, и генерировать соответствующие команды компоновщика. Из вашего вопроса мне непонятно, сделали вы это уже или нет.
  3. Если у вас есть дополнительный файл «.S» (не совсем понятно из вашего вопроса), сделайте то же самое с ним (но учтите, что в некоторых ОС IDE хочет видеть такие файлы с явной буквой «S» в верхнем регистре). чтобы распознать их как источник сборки.

Другие вопросы по теме