реклама на сайте
подробности

 
 
> Как использовать библиотечную функцию в WinAVR?
AVRdeveloper
сообщение Apr 14 2008, 11:41
Сообщение #1





Группа: Новичок
Сообщений: 11
Регистрация: 8-02-08
Пользователь №: 34 857



Здравствуйте, у меня возникла проблема с освоением WINAVR. При попытке использовать библиотечные функции из Procyon AVRlib Version 20061029 студия ругается. А именно, при использовании функции uartInit(); или еще какой то из того же пакета происходит ошибка:

" C:\WinAVR-20071221\Uart\default/../s_uart.c:7: undefined reference to `uartInit' ".

(gcc ver.20071221)
Листинг:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "buffer.h"
#include "uart.h"

int main ()
{
uartInit();
return 0;
}

Хедеры, которые определены в сорцах, я так же скопировал в каталог с моим исходником.
Что я не так делаю? Кто-то ведь использовал эту библиотеку, подскажите, буду благодарен за простой пример вроде "Hello, world!" с использованием библиотечных функций. smile3046.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Steel_monkey
сообщение Apr 26 2008, 21:15
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 12-05-07
Из: Северная Венеция
Пользователь №: 27 684



Столкнулся с аналогичной проблемой в WinAVR200712.. Хочу использовать uartInit из набора библиотек AVRlib в своей программе. Кидаю uart.h и uart.c , а так же все остальные *.h файлы, которые вызывает uart.h и друг друга, ну и *c файлы к ним ( global.h, buffer.h, buffer.c, avrlibdefs.h, avrlibtypes.h) в директорию проекта, где находится main.c.
Вариант первый: подключаю только uart.h
Код
#include "uart.h"


В программе есть

Код
uartInit()


результат
main.c:108: undefined reference to `uartInit'
В секции "Linking: main.elf" , из чего я делаю вывод, что это косяк линкера.


Попытка два: подключаю все хидеры:

Код
#include "uart.h"
#include "global.h"
#include "buffer.h"
#include "avrlibdefs.h"
#include "avrlibtypes.h


Результат тот же.

Вариант 3.
Теперь подключаю еще и *.с файлы.


Код
#include "uart.h"
#include "uart.c"
#include "global.h"
#include "buffer.h"
#include "buffer.c"
#include "avrlibdefs.h"
#include "avrlibtypes.h


Теперь компилит. Но засовывает все содержимое *.с файлов в программу, результат 2 килобайта вместо 400 байт, и это если убрать uartInit ( то есть ничего из вложенных функций не вызывается).
Подскажите пожалуйста простым русским языком, что и куда надо дописать. Поискал тут на форуме, почитал документацию по ВинАВР. Что-то линкеру скормить надо (как?), но он (линкер) для меня это даже не темный лес, это соседняя галактика.

Сообщение отредактировал Steel_monkey - Apr 26 2008, 21:16
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 06:38
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Steel_monkey @ Apr 27 2008, 00:15) *
результат
main.c:108: undefined reference to `uartInit'
В секции "Linking: main.elf" , из чего я делаю вывод, что это косяк линкера.
Нет, это косяк программиста, не прочитавшего (или не понявшего) учебника по С. Ключевые слова для поиске в учебнике - "раздельная компиляция", "заголовочные файлы (header files)", "объявление и определение функций". Причем сначала надо понять разницу между объявлением и определением функции, из этого вытекает все остальное.
Цитата(Steel_monkey @ Apr 27 2008, 00:15) *
Вариант 3.
Теперь подключаю еще и *.с файлы.

Что-то линкеру скормить надо (как?), но он (линкер) для меня это даже не темный лес, это соседняя галактика.
Методом тыка удалось попасть в правильный вариант. Лучше бы это время потратили на чтение учебника - приблизили галактику. Если в качестве оболочки используете студию, то на вкладке дополнительных опций компилятора дописываете -ffunction-sections, -fdata-sections. На вкладке дополнительных опций линкера впишите -Wl,--gc-sections. Что означают эти опции, вы найдете в описаниях на gcc, ld, avr-libc в папке документации WinAVR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 05:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016