AVR-GCC头文件中未声明的标识符

ff29svar  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(158)

我创建了以下头文件,其中包含要在代码中使用的AVR引脚的定义。

#define LED_PORT        PORTB
#define LED_PIN         PINB
#define LED_DDR         DDRB

#define LED0            PB0

我遇到了两个我无法解决的失败。
1)我在这个头文件中有两个问题,如下所示:

2)此外,我在USART. h文件的USART头文件中创建的函数(我实现的)也无法识别

我其实不明白为什么会这样。因为代码显然已经实现了头文件。

#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>
#include "pinDefinition.h"
#include "USART.h"

int main(void) {
  char serialCharacter;
  LED_DDR = 0xff;
  initUSART();
  printString("Hello World!\r\n");

  while (1) {
    serialCharacter = receiveByte();
    transmitByte(serialCharacter);
    LED_PORT = serialCharacter;
  }

  return (0);
}

我使用的编译器是AVR-GCC。
此外,当我直接包含USART.c时,一切都工作正常。但我不明白为什么头文件不工作。
我创建了一个运行编译器/链接器的脚本:

#!/bin/bash
avr-gcc -g -Os -mmcu=atmega328p -c code.c util.c USART.c
avr-gcc -g -mmcu=atmega328p -o code.elf code.o
avr-objcopy -j .text -j .data -O ihex code.elf code.hex
avr-size --format=avr --mcu=atmega328p code.elf

这将返回上述错误。
USART.h如下所示:

/* These are defined for convenience */
#define   USART_HAS_DATA   bit_is_set(UCSR0A, RXC0)
#define   USART_READY      bit_is_set(UCSR0A, UDRE0)

#include <stdint.h>

void initUSART(void);
void transmitByte(uint8_t data);
uint8_t receiveByte(void);
void printString(const char myString[]);
void readString(char myString[], uint8_t maxLength);
void printByte(uint8_t byte);
void printWord(uint16_t word);
void printBinaryByte(uint8_t byte);
char nibbleToHex(uint8_t nibble);
char nibbleToHexCharacter(uint8_t nibble);
void printHexByte(uint8_t byte);
uint8_t getNumber(void);

我真的需要一些帮助,因为我正在努力解决这个问题,现在三天,并阅读了很多不同的来源(我得到我的绳子仍然与C,所以请注意)。C

lhcgjxsq

lhcgjxsq1#

我创建了一个运行编译器/链接器的脚本:
avr-gcc -g -Os -mmcu=atmega328p -c code.c util.c USART.c
此命令生成三个文件:code.outil.oUSART.o,而以下链接命令仅链接一个目标文件:
avr-gcc -g -mmcu=atmega328p -o code.elf code.o
因此,后两个编译单元的所有函数都丢失了,这导致了链接器中出现一串 “undefined reference to”。修复方法是链接所有三个目标文件:
avr-gcc -g -mmcu=atmega328p -o code.elf code.o util.o USART.o
头文件中未声明的标识符
C中的头文件(module.h)只包含模块(module.c)中的函数声明,但函数的实现/定义在 *.c文件中。(一个例外是在头文件中定义的static inline函数,但代码中未定义的引用不是这种情况。)

相关问题