为何GCC编译器无法识别并诊断析构函数缺失定义问题?
踩坑记录:未实现析构函数导致的链接器错误
最近耗了大把时间排查一个事后看极其简单的链接器错误,最终发现问题出在基类的析构函数上:
头文件里我只写了声明:
~SomeClass();
却没有提供具体实现,正确的写法应该是直接在头文件里定义空实现:
~SomeClass(){};
有点费解的是,GCC明明能揪出不少复杂的编译问题,这种情况却没在编译阶段提示,直到链接环节才报错。补充下环境:用CMake构建,编译器是GCC。
为什么是链接器错误而非编译错误?
编译器在处理代码时,只要看到析构函数的声明,就会认为后续会有对应的实现存在,不会在编译阶段报错。只有当链接器尝试把所有目标文件整合到一起,寻找这个析构函数的具体代码时,发现找不到对应的实现,才会抛出未定义符号的链接错误。
内容的提问来源于stack exchange,提问作者LNorth
相关产品推荐
相关产品推荐

