C++继承Shape抽象类时出现rt::Plane类vtable缺失错误如何解决
问题原因
你复制Sphere代码改写Plane的操作本身没有问题,代码层面的虚函数声明、实现都符合语法要求,报错的根源在构建配置缺失:
从make VERBOSE=1的输出可以看到,链接阶段参与编译的shape类目标文件只有Sphere.cpp.o,没有你新增的Plane.cpp.o,说明Plane.cpp没有被纳入CMake的编译源文件列表。
Clang编译器会将类的虚函数表(vtable)存放在该类第一个非内联虚函数实现对应的编译单元中,你的Plane类第一个非内联虚函数intersect的实现写在Plane.cpp里,这个文件没有被编译,链接时自然找不到Plane类的vtable,就抛出了对应的错误提示。
解决方法
- 找到项目中配置编译源文件的
CMakeLists.txt:通常是shapes目录下的CMakeLists.txt,或者项目根目录的CMakeLists.txt - 在
add_executable(或对应生成raytracer目标的配置段)的源文件列表中,找到已经配置的shapes/Sphere.cpp,在同一位置新增shapes/Plane.cpp - 重新执行
cmake .生成新的构建配置,再运行make编译即可解决问题。
内容的提问来源于stack exchange,提问作者Riverendell
相关产品推荐
相关产品推荐

