/tmp/arduino/sketches/2D79E9117D9D13C4A4A6DC41AD1CF7A4/sketch/main.cpp.o: In function `blink_program_init(pio_hw_t*, unsigned int, unsigned int, unsigned int)': /home/lvguangjie/Arduino/rp2040/sketch_jan14b/blink.pio.h:45: multiple definition of `blink_program_init(pio_hw_t*, unsigned int, unsigned int, unsigned int)' /tmp/arduino/sketches/2D79E9117D9D13C4A4A6DC41AD1CF7A4/sketch/clock_out.cpp.o:/home/lvguangjie/Arduino/rp2040/sketch_jan14b/blink.pio.h:45: first defined here collect2: error: ld returned 1 exit status
错误信息提示的是链接器(ld)在尝试创建最终的可执行文件时遇到了问题,具体是blink_program_init
函数在多个地方被定义了。在你的编译输出中,blink_program_init
函数在main.cpp.o
和clock_out.cpp.o
两个对象文件中都有定义,这通常是由于以下原因之一:
-
头文件中的定义 :
blink_program_init
函数可能在头文件blink.pio.h
中被定义,并且这个头文件被多个源文件(如main.cpp
和clock_out.cpp
)包含。在C++中,你应该只在头文件中声明函数,而在单个源文件中定义它。 -
多次包含 :如果
blink.pio.h
被同一个源文件多次包含,而你又没有使用包含守卫(也称为头文件保护),这也可能导致函数被多次定义。 -
条件编译错误:可能存在条件编译的错误,使得同一个函数在不同的条件下被多次定义。
为了解决这个问题,你可以:
- 确保
blink_program_init
函数只在一个源文件中定义,如main.cpp
或clock_out.cpp
。 - 如果需要在头文件中提供函数原型,请确保你使用的是函数声明而不是定义。例如:
|---|----------------------------------------------------------------------------------------------------------------|
| | // blink.pio.h
|
| | extern "C" void blink_program_init(pio_hw_t* hw, unsigned int sm, unsigned int pin_base, unsigned int freq);
|
然后在某个源文件中提供定义:
|---|------------------------------------------------------------------------------------------------------------------|
| | // main.cpp 或 clock_out.cpp
|
| | extern "C" void blink_program_init(pio_hw_t* hw, unsigned int sm, unsigned int pin_base, unsigned int freq) {
|
| | // 函数实现
|
| | }
|
-
使用包含守卫来防止头文件被多次包含。例如:
|---|-------------------------|
| |// blink.pio.h
|
| |#ifndef BLINK_PIO_H
|
| |#define BLINK_PIO_H
|
| | |
| |// 头文件内容
|
| | |
| |#endif // BLINK_PIO_H
|
已解决,在另一个文件中重复定义blink_program_init函数。