C 如何将.o文件转换为.elf文件?
我有一个名为lab7.c的文件,当我编译成一个.o文件时,一切都很好。然而,接下来我将使用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
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的文件