将多个目标文件链接到二进制 AVR GCC
Linking multiple object files into a binary AVR GCC
我有以下头文件和源文件:
AVR_comunic.h
#ifndef AVR_COMUNIC_H_
#define AVR_COMUNIC_H_
#include<avr/io.h>
#define FOSC 20000000UL // Clock Speed
#define BAUD 19200
#define MYUBRR FOSC/16/BAUD-1
void USART_Init( unsigned int);
int USART_WriteChar(unsigned char);
// int USART_Receive( unsigned char *);
void USART_Flush(void);
#endif /* AVR_COMUNIC_H_ */
AVR_comunic.c
#include "AVR_comunic.h"
void USART_Flush( void )
{
...
}
void USART_Init( unsigned int ubrr)
{
...
}
int USART_WriteChar(unsigned char data)
{
...
}
和main_f.c
#include"AVR_comunic.h"
void init_ports()
{
DDRD|= (1<<PD7);
}
int main(void)
{
init_ports();
...
while(1)
{
// now what?
}
return 1;
}
我在Notepad++中写了一个批处理文件来获取这个程序的.hex文件
COMPILE_BUILD.bat
ECHO OFF
ECHO ----------------------------------------------------------
ECHO ----- executing your commands : compile and build -------
ECHO ----------------------------------------------------------
avr-gcc -g -Wall -Os -DF_CPU=20000000UL -mmcu=atmega88p -c AVR_comunic.c
avr-gcc -g -Wall -Os -DF_CPU=20000000UL -mmcu=atmega88p -c main_f.c
avr-gcc -g -mmcu=atmega88p -o AVR_comunic.elf main_f.o AVR_comunic.o
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-gcc -g -mmcu=atmega8 -Wl,-Map,AVR_comunic.map -o AVR_comunic.elf AVR_comunic.o
avr-objcopy -j .text -j .data -O ihex AVR_comunic.elf AVR_comunic.hex
ECHO ----------------------------------------------------------
ECHO ---------------------- happy ? ---------------------------
ECHO ----------------------------------------------------------
pause
我收到以下错误:
... : undefined reference to 'main'
avr-objcopy: 'AVR_comunic.elf' no such file
我从 Internet 上的信息了解到,链接器确实认为没有 "main" 功能......但它是......我做错了什么?或者我应该如何编写来编译多个源文件?
I understand from the information on internet that the linker does thinks that there is no "main" function ... but it is ... what am I doing wrong?
这个命令:
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
尝试从 AVR_communic.elf
中提取信息,但尚未生成。你想在这个命令之后移动它:
avr-gcc -g -mmcu=atmega8 -Wl,-Map,AVR_comunic.map -o AVR_comunic.elf AVR_comunic.o
上述命令失败并显示 undefined reference to: 'main'
,因为您 未 将 main_f.o
链接到其中。
看来你真正想要的是:
avr-gcc -g -mmcu=atmega88p -o AVR_communic.elf main_f.o AVR_comunic.o
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-objcopy -j .text -j .data -O ihex AVR_comunic.elf AVR_comunic.hex
我有以下头文件和源文件:
AVR_comunic.h
#ifndef AVR_COMUNIC_H_
#define AVR_COMUNIC_H_
#include<avr/io.h>
#define FOSC 20000000UL // Clock Speed
#define BAUD 19200
#define MYUBRR FOSC/16/BAUD-1
void USART_Init( unsigned int);
int USART_WriteChar(unsigned char);
// int USART_Receive( unsigned char *);
void USART_Flush(void);
#endif /* AVR_COMUNIC_H_ */
AVR_comunic.c
#include "AVR_comunic.h"
void USART_Flush( void )
{
...
}
void USART_Init( unsigned int ubrr)
{
...
}
int USART_WriteChar(unsigned char data)
{
...
}
和main_f.c
#include"AVR_comunic.h"
void init_ports()
{
DDRD|= (1<<PD7);
}
int main(void)
{
init_ports();
...
while(1)
{
// now what?
}
return 1;
}
我在Notepad++中写了一个批处理文件来获取这个程序的.hex文件
COMPILE_BUILD.bat
ECHO OFF
ECHO ----------------------------------------------------------
ECHO ----- executing your commands : compile and build -------
ECHO ----------------------------------------------------------
avr-gcc -g -Wall -Os -DF_CPU=20000000UL -mmcu=atmega88p -c AVR_comunic.c
avr-gcc -g -Wall -Os -DF_CPU=20000000UL -mmcu=atmega88p -c main_f.c
avr-gcc -g -mmcu=atmega88p -o AVR_comunic.elf main_f.o AVR_comunic.o
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-gcc -g -mmcu=atmega8 -Wl,-Map,AVR_comunic.map -o AVR_comunic.elf AVR_comunic.o
avr-objcopy -j .text -j .data -O ihex AVR_comunic.elf AVR_comunic.hex
ECHO ----------------------------------------------------------
ECHO ---------------------- happy ? ---------------------------
ECHO ----------------------------------------------------------
pause
我收到以下错误:
... : undefined reference to 'main'
avr-objcopy: 'AVR_comunic.elf' no such file
我从 Internet 上的信息了解到,链接器确实认为没有 "main" 功能......但它是......我做错了什么?或者我应该如何编写来编译多个源文件?
I understand from the information on internet that the linker does thinks that there is no "main" function ... but it is ... what am I doing wrong?
这个命令:
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
尝试从 AVR_communic.elf
中提取信息,但尚未生成。你想在这个命令之后移动它:
avr-gcc -g -mmcu=atmega8 -Wl,-Map,AVR_comunic.map -o AVR_comunic.elf AVR_comunic.o
上述命令失败并显示 undefined reference to: 'main'
,因为您 未 将 main_f.o
链接到其中。
看来你真正想要的是:
avr-gcc -g -mmcu=atmega88p -o AVR_communic.elf main_f.o AVR_comunic.o
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-objcopy -j .text -j .data -O ihex AVR_comunic.elf AVR_comunic.hex