انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: agape در 12 امرداد 1390، 06:24 بظ
-
](*,)
سلام خسته نباشید!
من یه مشکلی دارم که خیلی عجیب و غریب و بی ریشه است - من برای AVR یه برنامه نوشتم که یه چیزی رو توی خروجی UART نشون بده
حالا کامپایل نمیشه ! نمیدونم چرا ! انگار کتابخونه STDIO.h مشکل داره برنامه این هست:
#include <stdio.h>
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
_FDEV_SETUP_WRITE);
static int
uart_putchar(char c, FILE *stream)
{
if (c == '\n')
uart_putchar('\r', stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}
int
main(void)
{
init_uart();
stdout = &mystdout;
printf("Hello, world!\n");
return 0;
}
این دقیقا همون کدی هست که توی مثال های کتابخونه برای کار با این کتابخونه ارایه شده وحالا خطایی که میده اینه
main.c:(.text+0x1e)||undefined reference to `stdout'|
حاکی از این که stdout تعریف نشده
کل نت رو زیر و رو کردم چیزی دستگیرم نشد !
همین کد رو توی ویندوز برای winavr نوشتم که همون gcc تحت ویندوز هست کار میکنه و مشکلی نداره !
گفتم شاید کتابخونه خراب نصب شده اونو پاک کردم و دوباره نصب کردم ولی خوب بازم فرجی نشد
desktop:~$ sudo apt-get remove avr-libc
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
avr-libc
0 upgraded, 0 newly installed, 1 to remove and 457 not upgraded.
After this operation, 29.3MB disk space will be freed.
Do you want to continue [Y/n]? y
(Reading database ... 131904 files and directories currently installed.)
Removing avr-libc ...
desktop:~$ sudo apt-get install avr-libc
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
avr-libc
0 upgraded, 1 newly installed, 0 to remove and 457 not upgraded.
Need to get 0B/5,117kB of archives.
After this operation, 29.3MB of additional disk space will be used.
Selecting previously deselected package avr-libc.
(Reading database ... 130370 files and directories currently installed.)
Unpacking avr-libc (from .../avr-libc_1%3a1.6.7-1ubuntu2_all.deb) ...
Setting up avr-libc (1:1.6.7-1ubuntu2) ...
حالا حسابی موندم توش که خوب یعنی چی ؟!این خطایی که داره میده !
-
شما باید مشکلAuthentication رو درPAM حل کنی
gcc nameOfFile.c -lpam -lpam_misc
-
این کد رو بعد از دستور include بنویس شاید مشکلت حل بشه :
-
main.c:(.text+0x1e)||undefined reference to
این مشکل بیشتر شبیه به Link error هست تا کامپایل error یعنی یه جورایی C runtime library رو نمی شناسه!
-
کتابخانه ++c شناسه هاش رو تو یک فضای نامی به نام std تعریف میکنه تا با شناسه های تعریف شده توسط برنامه نویس اشتباه نشن برای استفاده از این شناسه ها باید با دستور ;using namespace std آنها رو به کامپایلر معرفی کنی ویا قبل از استفاده از اونها بنویسی ::std شناسه stdout رو هم که شما تو تابع main استفاده کردی به کامپایلر معرفی نکردی . شما میتونی دستورتت رو این طوری هم بنویسی:
std::stdout = &mystdout;
-
آقا هیچ کدوم از این کارایی که گفته بودین کار نکرد ! ](*,)
منم نمیدونم این چشه
کلافم کرده از بس راه های مختلف رو امتحان کردم دیونه شدم!
-
مشکل اون نیست. شما به جای اینکه یه خط رو که فکر میکنید خطا اونجا اتفاق اافتاده، کل خطا رو کپی کنید. اگه کد شما دقیقا همینه که یه چند تایی include کم داره.
مینیمم اینا رو کم داره :
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/sfr_defs.h>
و نکته دیگه اینکه تابع init_uart() رو خودتون باید نوشته باشید، تا اونجا که من میدونم چنین تابعی نداریم.
اون تابع رو که حذف کنید-یا خودتون بدنه اونو بنویسید-، و اون include ها رو اضافه کنید درست کامپایل میشه.