C 如何将.o文件转换为.elf文件?

C 如何将.o文件转换为.elf文件?,c,macos,avr,avr-gcc,avrdude,C,Macos,Avr,Avr Gcc,Avrdude,我有一个名为lab7.c的文件,当我编译成一个.o文件时,一切都很好。然而,接下来我将使用 avr-gcc -mmcu=atmega324a -o lab7.elf lab7.o 我得到的错误消息是 lab7.o:(.data+0x8): undefined reference to `lcd_putc' lab7.o: In function `main': lab7.c:(.text.startup+0x0): undefined reference to `lcd

我有一个名为lab7.c的文件,当我编译成一个.o文件时,一切都很好。然而,接下来我将使用

avr-gcc -mmcu=atmega324a -o lab7.elf lab7.o
我得到的错误消息是

    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
我找遍了所有地方试图解决这个问题,但什么也找不到。我所要做的就是把这段代码上传到我的实验板上。我正在使用macOS Sierra上的终端用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是我的老师给我的,因此我没有一个名为lcd.c的文件。对象文件lab7.o只有一个c文件中的代码。它只是整个可执行文件的一部分

要创建可执行文件,需要将所有部分链接在一起。从您显示的代码来看,您似乎缺少具有LCD功能的部件。你有一个叫做lcd.o的文件吗?试一试

avr-gcc -mmcu=atmega324a -o lab7.elf lab7.o lcd.o
也可能是LCD功能位于库或归档文件中。在这种情况下,您需要以其他方式链接它,但它仍然需要是gcc命令的一部分

avr-gcc -mmcu=atmega324a -o lab7.elf lab7.c lcd.c lcd.h
如果您拥有所有源文件(.c和.h),则可以使用一个gcc命令从源代码编译到.elf

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

您有链接器错误。添加your make文件和头文件,其中声明了
lcd_putc
lcd_init
,以及.c文件。如何执行此操作?在运行avr gcc的目录中,应该是一个名为Makefile的文件。您可以编辑问题并添加它。另外,链接器找不到
lcd_putc
lcd_init
(函数?)所以在调用、声明和实现这些的地方添加源代码/文件。我对所有这些都很陌生,有什么办法可以一步一步给出吗?首先将lab7.c的内容添加到问题中,还有lab7.h。我没有一个名为lcd.o的文件,我只有一个名为lcd.h的文件