报错:multiple definition of XXX
·
c/c++语言在编译时报错:multiple definition of XXX,顾名思义,错误在于重复定义。
首先需要明确的一点的是,在编译项目里的.c/.cpp文件时会同时编译其include的头文件。
报错原因一:
多个文件同时引用同一个.h头文件,导致里面的东西被重复定义。
系统性解决方法:为头文件加上条件编译:#ifndef
例如你的头文件是:test.h,加上条件编译后:
#ifndef TEST_H
#define TEST_H
// 头文件内容
#endif
报错原因二:
如果你的代码已经有条件编译 #ifndef 依然报错multiple definition of XXX,大概率是你编译文件的编写问题(Makefile 或者 CMakeLists.txt),导致XXX所在头文件被重复编译。
例如,在CMakeLists.txt里面将.h头文件也纳入到资源库的建立:
# 收集所有源文件
file(GLOB_RECURSE SRC_SOURCES
"*.cpp"
)
# 收集所有头文件(可选,用于IDE显示)
file(GLOB_RECURSE SRC_HEADERS
"*.h"
)
# 创建库
add_library(src_lib SHARED ${SRC_SOURCES} ${SRC_HEADERS})
如果将h头文件也编译进库并链接主文件main.cpp,然后主文件main.cpp又引用这个库的的头文件,就依然会导致重复编译的问题。这类现象的显著特征就是multiple definition of XXX后面会说XXX的第一次定义在main.cpp里面。
前面已经提过了,在编译项目里的.c/.cpp文件时会同时编译其include的头文件,所以只需要把c/cpp的编译写进编译文件即可:
# 收集所有源文件
file(GLOB_RECURSE SRC_SOURCES
"*.cpp"
)
# 创建库
add_library(src_lib SHARED ${SRC_SOURCES})
更多推荐

所有评论(0)