多文件编译遇funcX(float,float)重定义错误的技术求助
解决“multiple definition of `funcX(float, float)'”编译错误
问题原因
你把6个文件一起编译时,includeA.cpp和includeB.cpp都会被编译成独立的目标文件,这两个文件里都定义了签名完全相同的funcX(float, float)函数。虽然main.cpp通过条件编译只包含了其中一个头文件,但链接器合并所有目标文件时,会发现两个重复的函数定义,因此抛出错误。
解决办法
按需编译对应源文件
不要一次性编译所有6个文件,根据CONFIG的值选择编译对应的cpp:- 当
CONFIG=1时,编译命令只包含main.cpp和includeA.cpp - 当
CONFIG=2时,编译命令只包含main.cpp和includeB.cpp
- 当
用命名空间区分函数
修改头文件和源文件给函数加上命名空间:// includeA.h #ifndef INCLUDEA_H #define INCLUDEA_H namespace nsA { float funcX(float a, float b); } #endif// includeA.cpp #include "includeA.h" namespace nsA { float funcX(float a, float b) { return a * b; } }同样给
includeB.h和includeB.cpp加上nsB命名空间,然后在main.cpp里调整调用逻辑:#include "common.h" #if CONFIG == 1 #include "includeA.h" using namespace nsA; #else #include "includeB.h" using namespace nsB; #endif void main() { float x; float a = 3.0; float b = 5.7; x = funcX(a, b); }这样两个函数因为命名空间不同,不会被视为重复定义,编译所有文件也不会报错。
用static限制函数作用域
在两个cpp的函数定义前加上static关键字:// includeA.cpp #include "includeA.h" static float funcX(float a, float b) { return a * b; }// includeB.cpp #include "includeB.h" static float funcX(float a, float b) { return a + b; }static会把函数作用域限制在当前编译单元内,两个函数各自独立,链接时不会冲突。但要注意,加了static的函数不能被其他编译单元调用。
内容的提问来源于stack exchange,提问作者Bakyt
相关产品推荐
相关产品推荐

