2013-05-24 3 views
1

Я пытаюсь получить пользовательский робот для работы с IDE Arduino, объявив о новой аппаратной «плате» в среде IDE. Это содержит все сопоставления и еще что-то, но существует библиотека, к которой у меня есть доступ к источнику.Как это не определено?

Arduino IDE создает файл CPP следующим образом:

#line 1 "cbotj.ino" 
    #include "Arduino.h" 
    void setup(); 
    void loop(); 
    #line 1 
    void setup() 
    { 
     LED_open(); 
    } 

    void loop() 
    { 

    } 

Затем я получаю ошибку:

cbotj.cpp.o: In function `setup': 
/Applications/cbotj.ino:3: undefined reference to `LED_open()' 

Сейчас в Arduino.h для ядра Hardwares У меня есть

SUBSYS_OPENSTAT LED_open(void); 

Сама функция реализована в другом файле .c в рамках основной аппаратной функции s (например, pinMode) и является полностью действительным, поскольку он работает как скомпилированная библиотека для других IDE, таких как AVR Studio 4 и 6. Atmel.

Почему я получаю неопределенную ссылку? Заголовки включены и т. Д.

Аппаратное обеспечение выбрано так, как оно работает, если бы я использовал такие вещи, как pinMode на штыре для работы светодиодов.

ТИА

+2

Вы установили проект для использования вашей скомпилированной библиотеки или добавили файл cpp в свой проект? –

+0

Да, я сделал. Он автоматически настраивается через компонент оборудования. Выбрал мою доску, определенную в файле users.txt. – Demortes

+0

Я также вижу файл, скомпилированный в подробном режиме '/ Applications/Arduino.Приложение/Содержание/Ресурсы/Java/hardware/tools/avr/bin/avr-ar rcs /var/folders/mj/ldxmpsp90w5bkwclzkt8srx00000gn/T/build6634653328907666647.tmp/core.a/var/folders/mj/ldxmpsp90w5bkwclzkt8srx00000gn/T/build6634653328907666647 .tmp/LED_open.co' – Demortes

ответ

3

При соединении с функциями из .c файла в проекте C++ (который, кажется, что у вас есть), you need to declare the function as extern "C".

Попробуйте изменить файлы заголовков;

SUBSYS_OPENSTAT LED_open(void); 

в

extern "C" { 
    SUBSYS_OPENSTAT LED_open(void); 
} 

EDIT: Кажется, что более чем один файл путаются C++, попробуйте положить все ваши C включает в extern "C" в вашем CPP файле вместо;

extern "C" { 
    #include "Arduino.h" 
} 

void setup(); 
void loop(); 

void setup() 
{ 
    LED_open(); 
} 

void loop() 
{ 

} 
+0

I ' ранее пробовал ошибку компилятора: 'cores/standard/led324v221.h: 40: error: предыдущее объявление 'SUBSYS_OPENSTAT LED_open()' с 'C++' linkage core/standard/Arduino.h: 85: error: conflict с новой декларацией с 'C' linkage' – Demortes

+0

Нашел в этой строке прототип 'extern' .... Я предполагал, что это не нужно, поэтому я прокомментировал это и, похоже, скомпилировал ... но теперь мне нужно сделайте это с другими файлами заголовков, которые будут испытывать ту же проблему. Прокомментируйте, если это сработает и примет ответ, в противном случае вернется после того, как я закончил, если он не сработает. – Demortes

+1

@Demortes См. редактирование того, как не нужно делать это везде. –

0

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

Поэтому вам нужно включить файл .cpp в свой проект (ошибка возникает из-за того, что этого не произошло). Вы думаете, что у вас есть (из комментариев, только что видели), но вы, вероятно, этого не сделали. :) В комментариях вы указываете включение файла .c; это опечатка здесь? Или подписи декларации и определения могут непреднамеренно отличаться.

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

+0

Я смущен тем, что вы пытаетесь сказать здесь. Библиотека C, а не C++. Я предпочел бы избежать преобразования всей библиотеки в класс для C и просто использовать функции, подобные pinMode, поэтому я пытаюсь использовать ее как пользовательскую плату, а не библиотеку. Теперь файл C скомпилирован в объектный файл, но при связывании, LED_open() не найден, но он, очевидно, имеет объектный файл для его создания в последний файл hex для мигания на мой MCU. Я что-то не понимаю? – Demortes

+0

«Сама функция реализована в другом ** файле cpp ** в ядре» Теперь я тоже смущен ... –

+0

Для внешней библиотеки я не могу использовать предварительно скомпилированную статическую библиотеку, поскольку среда IDE Arduino динамически генерирует CPP и нет возможности изменить параметры компоновщика, которые я прочитал. – Demortes

Смежные вопросы