课堂程序编译报Multiple Definition of错误,请求技术排查协助
嘿,我太懂这种编译报错卡半天的滋味了!多重定义(Multiple Definition)一般都是链接阶段的问题,大概率是头文件没处理好或者重复编译了代码。结合你提到的文件(main.cpp、person.h、person.cpp),我给你列几个最常见的排查方向,你挨个试试:
检查person.h的头文件保护:这是最容易踩的坑!如果头文件没加保护,每次被其他
.cpp文件include时,都会把里面的内容重复复制一遍,链接时就会触发多重定义。给person.h加上标准的头文件保护:#ifndef PERSON_H #define PERSON_H // 这里放person.h的所有内容 #endif // PERSON_H也可以用
#pragma once替代,不过前者的跨平台兼容性更好。别在头文件里写变量/函数的定义:很多新手会把函数实现或者全局变量直接放到头文件里,比如在person.h里写
int g_age = 18;或者void showInfo() { cout << "..." << endl; }。正确的做法是:- 头文件里只放声明:比如
extern int g_age;(变量声明)或者void showInfo();(函数声明) - 把定义/实现放到person.cpp里:比如
int g_age = 18;或者void showInfo() { /* 具体代码 */ }
- 头文件里只放声明:比如
检查编译命令是否重复编译文件:比如用g++编译时,别不小心写成
g++ main.cpp person.cpp person.cpp——重复编译同一个.cpp文件也会导致链接时出现多重定义。仔细看看你的编译脚本或者IDE的编译配置,确保每个.cpp文件只被编译一次。排查全局变量重复定义:看看main.cpp里是不是也定义了和person.cpp里同名的全局变量?或者person.h里的某个变量没有用
extern声明,导致多个.cpp文件include后都生成了一份定义(这又回到了头文件保护的问题)。检查inline函数的正确性:如果person.h里有
inline函数,要确保inline关键字没漏写,并且函数的定义在所有包含该头文件的编译单元里完全一致——不过这个情况的概率相对低一些,可以最后排查。
你先从这几个方向查起,尤其是头文件保护和头文件里的定义问题,90%的情况都是这俩原因。要是排查完还是有问题,可以把相关的代码片段贴出来,我再帮你细看!
内容的提问来源于stack exchange,提问作者CarlosM

