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

 
 
 
Reply to this topicStart new topic
> printf_P + dlib, Не работает
alux
сообщение Mar 13 2008, 13:46
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Рабочий проект на Си перенес в новый проект на С++. Раньше printf_P нормально работало с CLIB. Теперь с DLIB(Normal) выдает ошибку
Код
Error[e46]: Undefined external "__write" referred in ?putchar ( C:\Program Files\...\avr\LIB\DLIB\
На телесиськах посоветовали подключить к проекту write.c из
C:\Program Files\IAR Systems\Embedded Workbench 5.0 Evaluation\avr\src\lib\dlib. Теперь компилится без ошибок. Но и ничего не выводит на терминал. Почему?
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 13 2008, 14:51
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(alux @ Mar 13 2008, 15:46) *
Рабочий проект на Си перенес в новый проект на С++. Раньше printf_P нормально работало с CLIB. Теперь с DLIB(Normal) выдает ошибку
Код
Error[e46]: Undefined external "__write" referred in ?putchar ( C:\Program Files\...\avr\LIB\DLIB\
На телесиськах посоветовали подключить к проекту write.c из
C:\Program Files\IAR Systems\Embedded Workbench 5.0 Evaluation\avr\src\lib\dlib. Теперь компилится без ошибок. Но и ничего не выводит на терминал. Почему?

В руководстве на компилятор есть описание для чего нужна функиця write и putchar, может та, что вы присоединили, не соответствует вашим требованиям?
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 13 2008, 15:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(gotty @ Mar 13 2008, 18:51) *
может та, что вы присоединили, не соответствует вашим требованиям?

Требование у меня обычное - выводить на терминал значения переменных в соответствии со спецификацией printf. В CLIB для этого нужно было определить функцию
Код
int putchar(int data)
{
  while(!(UCSR0A&(1<<UDRE0))); // wait until byte sendt
  UDR0=data;
  return(data);
}
А в DLIB как?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 13 2008, 15:35
Сообщение #4


Гуру
******

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



Цитата(alux @ Mar 13 2008, 17:04) *
А в DLIB как?
Думаю, что также. Вы только не обратили внимания на свою же фразу:
Цитата
проект на Си перенес в новый проект на С++.
C++ использует изменение (mangling) имен С++ - функций для обеспечения... черт, из головы вылетело как это называется, в общем чтобы иметь несколько функций с одинаковым именем и разными наборами/типами параметров. Поэтому, когда вы перенесли свой putchar в С++, его имя в объектном файле изменилось. Поэтому линкер ее не нашел и прицепил функцию putchar из библиотеки, которая, в свою очередь, вызывает __write. Вам нужно явно объявить эту функцию как функцию с С-связыванием:
Код
extern "C" int putchar(int data)
{
  while(!(UCSR0A&(1<<UDRE0))); // wait until byte sendt
  UDR0=data;
  return(data);
}


Цитата
На телесиськах посоветовали
О! Сейчас там такой контингент... Спецы из-за известных личностей ушли... Так что там сейчас могут и не такого насоветовать.


--------------------
На любой вопрос даю любой ответ
"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
alux
сообщение Mar 13 2008, 15:53
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Размеры моей благодарности не имеют границ. Спасибо., Сергей beer.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 21:25
Рейтинг@Mail.ru


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