Mac端C++开发SFML项目出现duplicate symbol错误该如何排查?
问题排查方案
该重复符号报错大概率和#include引用的不规范使用直接相关,结合所有重复符号均来自首个编译cpp文件的特征,可按以下优先级逐一排查:
- 排查是否误将cpp文件引入其他cpp
检查statemanager.cpp、introstate.cpp等其他参与编译的cpp文件开头,是否存在#include "sfgamewindow.cpp"这类引入cpp文件的写法。这种写法会将sfgamewindow.cpp的代码直接插入到对应cpp中,相当于同一套代码被多次编译,自然会出现全量符号重复的问题,删除这类错误引入即可。 - 检查头文件的全局定义规范
先通过命令c++filt __Z2dpi还原得到重复符号的原始名称(本例中为名为dpi的函数/变量),再定位其定义位置:- 如果该符号是在头文件中直接定义的全局变量:头文件中仅保留
extern 类型 dpi;的声明,将实际定义类型 dpi = 初始值;移到对应的cpp文件中 - 如果该符号是在头文件中直接实现的普通函数:要么给函数加
inline关键字,要么将函数实现移到对应cpp文件,头文件仅保留函数声明
- 如果该符号是在头文件中直接定义的全局变量:头文件中仅保留
- 检查头文件是否添加防护
确认所有头文件开头都添加了#pragma once或者传统头文件保护宏,避免单编译单元内头文件被重复引入导致的重复定义问题:#ifndef SFGAMEWINDOW_H #define SFGAMEWINDOW_H // 头文件内容 #endif - 排查符号重复定义
检查是否存在同名函数/全局变量在多个cpp文件中分别定义的情况,合并重复定义即可。
你提交的编译指令没有重复引入同一cpp文件的问题,无需调整编译命令。
内容的提问来源于stack exchange,提问作者John Ziegler
相关产品推荐
相关产品推荐

