2016-11-23 4 views
-2

J'ai un fichier nommé lab7.c et quand je compile pour en faire un fichier .o tout va bien. Mais je vais en faire un fichier .elf avecComment faire un fichier .o dans un fichier .elf?

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

Je reçois le message d'erreur de

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 

Je l'ai cherché partout pour essayer de résoudre ce problème et ne peux pas trouver quoi que ce soit. tout ce que j'essaie de faire est de télécharger ce code sur ma planche à pain. J'utilise terminal sur macOS Sierra écrit en C.

lab7.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 m'a été donné par mon professeur, donc je n » t un fichier nommé lcd.c

+0

Vous avez une erreur de liaison. Ajoutez le fichier make et les fichiers d'en-tête dans lesquels 'lcd_putc' et' lcd_init' sont déclarés ainsi que les fichiers .c. –

+0

Comment puis-je faire cela? –

+0

Dans le répertoire où vous exécutez avr-gcc, devrait être un fichier nommé Makefile. Vous pouvez modifier la question et l'ajouter. De plus, l'éditeur de liens ne trouve pas 'lcd_putc' et' lcd_init' (fonctions?) Donc ajoutez vos codes/fichiers sources où vous les appelez, les déclarez et les implémentez. –

Répondre

1

Le fichier objet lab7.o contient uniquement le code d'un des fichiers c. Ce n'est qu'une partie de tout l'exécutable. Pour créer l'exécutable, vous devez lier ensemble toutes les pièces. À partir du code que vous montrez, il semble qu'il vous manque les pièces avec les fonctions LCD. Avez-vous un fichier appelé lcd.o? Essayez

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

Il se peut également que les fonctions LCD soient dans une bibliothèque ou un fichier d'archive. Dans ce cas, vous devrez le lier d'une autre manière, mais il doit toujours faire partie de la commande gcc.

Si vous avez tous les fichiers source (.c et .h), vous pouvez compiler depuis la source jusqu'à .elf avec une seule commande gcc.

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

Je n'ai pas de fichier nommé lcd.o, je n'ai qu'un fichier nommé lcd.h –