GCC/G++链接错误:C++项目Vector2类构造函数未定义引用问题排查
问题原因
你遇到的链接报错是C++模板类声明与实现分离导致的实例化符号缺失问题。
C++模板的本质是代码生成规则,编译器需要在模板实例化时可见完整的实现代码,才能生成对应类型的实例符号。你将Vector2模板类的所有方法实现放在了foundations.cc独立源文件中:
- 编译
foundations.cc时,编译器不知道后续其他源文件会用到Vector2<float>、Vector2<unsigned>、Vector2<int>这三种实例,不会主动生成对应类型的方法符号 - 编译
scenes.cc、worldsystemdemo.cc时,编译器只能看到Vector2的声明看不到实现,也无法生成对应实例的符号
最终链接阶段就会报找不到Vector2相关构造函数、方法的符号错误。
修复方案
有两种常用的修复方式,选其中一种即可:
方案1:模板实现移入头文件
把foundations.cc中所有Vector2模板的方法实现,全部移动到foundations.h头文件中,所有引用该头文件的编译单元都可以看到完整实现,编译时会自动生成需要的实例符号。
方案2:显式实例化需要的模板类型
如果你希望保持模板声明和实现分离的结构,可以在foundations.cc的末尾,添加如下三行代码,显式声明需要实例化的Vector2类型:
template struct Vector2<float>; template struct Vector2<unsigned>; template struct Vector2<int>;
编译foundations.cc时就会主动生成这三种类型的所有方法符号,链接时可以正常找到。
内容的提问来源于stack exchange,提问作者DesktopDev
相关产品推荐
相关产品推荐

