C++多文件项目编译报Car::printNumWheels未定义符号错误
报错原因
这是典型的C++链接阶段错误,共有两个诱因:
- 类成员函数实现缺失作用域限定符
你在Car.h的Car类中声明了成员函数void printNumWheels(),但在Car.cpp写实现时,直接定义了全局函数void printNumWheels(),没有加Car::类作用域前缀。这个全局函数和Car类的成员函数是完全独立的两个符号,链接器找不到Car::printNumWheels()对应的实现代码,就会抛出未定义符号的报错。 - 编译命令未覆盖全部源文件
你执行的g++ car.cpp命令仅编译了Car.cpp单个文件,构建C++项目时需要把所有参与运行的.cpp源文件都传入编译命令,否则链接阶段会缺失对应目标文件的符号。
修复步骤
- 修改
Car.cpp中的函数定义,给成员函数加上Car::作用域限定,修正后的代码如下:
#include <iostream> #include "Car.h" using namespace std; void Car::printNumWheels(){ cout << "four wheels"; }
- 使用正确的编译命令,把所有源文件都加入编译:
g++ Car.cpp main.cpp -o car
编译完成后直接运行生成的可执行文件即可正常输出结果,不会再出现之前的链接错误。
内容的提问来源于stack exchange,提问作者Eli Smith
相关产品推荐
相关产品推荐

