Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: printf_P + dlib
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
alux
Рабочий проект на Си перенес в новый проект на С++. Раньше 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. Теперь компилится без ошибок. Но и ничего не выводит на терминал. Почему?
msalov
Цитата(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, может та, что вы присоединили, не соответствует вашим требованиям?
alux
Цитата(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 как?
Сергей Борщ
Цитата(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);
}


Цитата
На телесиськах посоветовали
О! Сейчас там такой контингент... Спецы из-за известных личностей ушли... Так что там сейчас могут и не такого насоветовать.
alux
Размеры моей благодарности не имеют границ. Спасибо., Сергей beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.