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})

更多推荐