下面两段牢骚可以直接跳过
在编译项目时,出现multiple definition of ......first defined here,这个问题折磨了我好几天,在网上找资料,都是说因为在头文件中定义了函数或者变量的原因,然而排查了所有头文件,都是使用的条件编译,且只进行声明,没有问题。
最终感觉还是哪个源文件被多次编译了,因此以最笨的方法试错,将每一个源文件夹中的非必要源文件进行整理,不用的转移到新建的一个文件夹,最终找到了引起问题的源文件,发现是同一个文件夹中,有一个.c文件include了另外一个.c文件,而这两个文件都被编译,导致了重复定义。问题终于被解决v,下面进行总结:

问题

multiple definition of ......first defined here重复定义
/home/cjx/Work/DSP/install/bin/../lib/gcc/riscv32-unknown-elf/10.2.0/../../../../riscv32-unknown-elf/bin/ld: /tmp/ccTvCBmL.o:(.rodata+0x480): multiple definition of `riscv_rfft_sR_q15_len4096'; /tmp/ccrMNql5.o:(.rodata+0x1efdc): first defined here
/home/cjx/Work/DSP/install/bin/../lib/gcc/riscv32-unknown-elf/10.2.0/../../../../riscv32-unknown-elf/bin/ld: /tmp/ccTvCBmL.o:(.rodata+0x498): multiple definition of `riscv_rfft_sR_q15_len8192'; /tmp/ccrMNql5.o:(.rodata+0x1eff4): first defined here
/home/cjx/Work/DSP/install/bin/../lib/gcc/riscv32-unknown-elf/10.2.0/../../../../riscv32-unknown-elf/bin/ld: /tmp/ccEQy1Qf.o: in function `riscv_atan_f32':
riscv_atan_f32.c:(.text+0x0): multiple definition of `riscv_atan_f32'; /tmp/ccUjLufL.o:FastMathFunctions.c:(.text+0x1258): first defined here

原因

(1)变量或者函数在某一个头文件中定义(不是声明),而这个头文件被多个源文件包含,导致其中的变量或者函数多次编译;
(2)在项目中,对于依赖的源文件夹中的所有.c文件都会被编译,如果其中一个.c文件被另外一个.c文件include,就像下面的代码一样,那么就会导致被包含的那个.c文件中定义的变量和函数被两次编译,从而导致重复定义。

#include "riscv_cos_f32.c"

解决方法

(1)针对原因1,只在源文件中定义函数或者变量,而在头文件中使用extern关键字对其进行声明,且为了保证头文件只被编译一次,使用条件编译:#ifndef+#define+#endif,具体如下:

#ifndef _SOMEFILE_H_
#define _SOMEFILE_H_
	extern const variable;
	extern const functions;
#endif

(2)针对原因2,详查每个.c文件的包含关系。尽量不要使用.c文件包含.c文件,而使用头文件声明的方式调用另一个.c文件中的函数或者变量,否则容易忘记,导致重复定义。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐