2016-11-23 11 views
-2

私はlab7.cという名前のファイルを持っています。私がコンパイルして.oファイルにするときは、問題ありません。しかし、その後、私は試してみて、これを修正し、カントは何かを見つけるためにどこにでも見てきました.oファイルを.elfファイルにするにはどうしたらいいですか?

lab7.o:(.data+0x8): undefined reference to `lcd_putc' 
    lab7.o: In function `main': 
    lab7.c:(.text.startup+0x0): undefined reference to `lcd_init' 
    collect2: error: ld returned 1 exit status 

のエラーメッセージが表示されます

avr-gcc -mmcu=atmega324a -o lab7.elf lab7.o 

でそれには.elfファイルを作るために行きます。私がしようとしているのは、このコードをブレッドボードにアップロードすることだけです。私は「それゆえ、私はドン、C.

#include <avr/io.h>  
#include <stdio.h> 
#include "lcd.h" 

static FILE lcd_stdout=FDEV_SETUP_STREAM(lcd_putc,NULL,_FDEV_SETUP_WRITE); 

#define PUSHED 1 
#define RIGHT_BUTTON ((PINA&_BV(PIN3)) >> 3) 
#define LEFT_BUTTON ((PINA&_BV(PIN0)) >> 0) 

#define LEFTMOST 0b10000000 
#define RIGHTMOST 0b00000001 

int main(void) { 
enum states { left_serve, right_serve, moving_left, moving_right}; 



// Include the following variable declarations here 
char state;  // This variable holds the current state 
char leds;  // Current "court" --- inverse of PORTC 

lcd_init();  // If you want to write to the LCD 
stdout=&lcd_stdout; 

// Required setup for I/O pins 
DDRD = 0xFF;  // All PORTD pins are outputs 
DDRA = 0x10;  // PORTA pin 4 is an output, rest inputs 
PORTA |= 0x10;  // Only pin 4 is important - should be 1 

// Initialize "state" to "left_serve" here 
state=left_serve; 

if (LEFT_BUTTON == PUSHED) { 
    if (leds == LEFTMOST) { 
     state = moving_right; 
    } 
    else 
    { 
     state = right_serve; 
    } 
} 
if (RIGHT_BUTTON == PUSHED){ 
    if (leds == RIGHTMOST) { 
     state = moving_left; 
    } 
    else 
    { 
     state = left_serve; 
    } 
} 
if (RIGHT_BUTTON != PUSHED && LEFT_BUTTON != PUSHED && leds == 0x00) { 
    if (state == moving_right) { 
     state = left_serve; 
    } 
    else 
    { 
     state = right_serve; 
    } 
} 
switch (state) { 

    case moving_left: 
    leds = leds << 1; 
    break; 

    case moving_right: 
    leds = leds >> 1; 
    break; 

    case right_serve: 
    leds = RIGHTMOST; 
    break; 

    case left_serve: 
    leds = LEFTMOST; 
    break; 
}  
void setLEDs(int leds) { 
PORTD= (leds^0x00FF); 
PORTC= (((~leds)>>8)&0x0003)+(PORTC&0xFFFC); 
} 

}  

lcd.h

#ifndef __LCD_H__ 
#define __LCD_H__ 

// A. Sheaff 1/10/2008 
// 4 bit LCD interface. 

// Define LCD type. Choose one. 
// #define LCD_1LINE 
// #define LCD_2LINE 
#define LCD_4LINE 
// End choice. 

// Set line length 
#define LCD_LINELEN 16 
// Set New line address 
#define LCD_LINE2A 0x40 

// Register select, Read/Write, Clock 
#define LCD_RS PIN4 
#define LCD_RW PIN6 
#define LCD_E PIN7 
// Code assumes lower 4 bits are for data. 
#define LCD_DATW PORTB 
#define LCD_DATR PINB 

// LCD commands 
#define LCD_CLR  0x01 // LCD Clear 
#define LCD_HOME 0x02 // LCD Home 
#define LCD_SETDD 0x80 // LCD Set Data Address 
#define LCD_SHIFT 0x10 // Shift 
#define LCD_SCURS 0x00 // Shift Cursor 
#define LCD_SDISP 0x08 // Shift Dislay 
#define LCD_SRGHT 0x04 // Shift Right 
#define LCD_SLEFT 0x00 // Shift Left 

// LCD initialization 
void lcd_init(void); 

// Wait for LCD to finish current operation. Returnds DD RAM address. 
unsigned char lcd_busy_wait(void); 

// Write character data to LCD 
void lcd_dwrite(unsigned char d); 
int lcd_putc(char c, struct __file * f); 

// Write instruction data to LCD 
void lcd_iwrite(unsigned char d); 

// Read data memory 
unsigned char lcd_dread(void); 
#endif // __LCD_H__ 

lcd.hが先生によって私に与えられたlab7.cを書くMacOSのシエラの端末を使用していますlcd.cというファイルがあります

+0

リンカーエラーがあります。あなたのmakeファイルと 'lcd_putc'と' lcd_init'が宣言されているヘッダファイルと.cファイルを追加してください。 –

+0

これをどうやって行うのですか? –

+0

avr-gccを実行するディレクトリで、Makefileという名前のファイルである必要があります。質問を編集して追加することができます。また、リンカは 'lcd_putc'と' lcd_init'(関数?)を見つけられませんので、あなたが呼び出した場所、ソースコード/ファイルを宣言して実装してください。 –

答えて

1

オブジェクトファイルlab7.oには、cファイルのいずれかのコードしかありません。実行可能ファイル全体の一部にすぎません。

実行ファイルを作成するには、すべての部分をリンクする必要があります。表示されたコードから、LCD機能で部品が欠落しているように見えます。 lcd.oというファイルがありますか?試してみてください

avr-gcc -mmcu=atmega324a -o lab7.elf lab7.o lcd.o 

また、LCD機能がライブラリまたはアーカイブファイルにある可能性があります。その場合、他の方法でリンクする必要がありますが、それでもgccコマンドの一部である必要があります。

すべてのソースファイル(.cと.h)をお持ちの場合は、ソースからgccコマンドを1つ使用して.elfまでコンパイルできます。

avr-gcc -mmcu=atmega324a -o lab7.elf lab7.c lcd.c lcd.h 
+0

lcd.oという名前のファイルがありません。lcd.hという名前のファイルしかありません。 –

関連する問題