代码正确,但是一直提示错误
undefined reference to `PrintHandler::PrintHandler(Looper*)'
collect2.exe: error: ld returned 1 exit status
无意中发现自己运行的是 main.cpp 而不是整个项目,运行整个项目就会正常了。
具体原因见 AI
这是一个 CLion 或 CMake 配置相关的问题,不是代码逻辑问题,而是你在运行 main.cpp
文件单独作为“单文件运行”时,编译器没有正确链接整个项目的所有 .cpp
文件(例如 Looper.cpp
、PrintHandler.cpp
等),从而导致:
undefined reference to `Looper::postMessage(...)`
undefined reference to `vtable for PrintHandler`
...
✅ 原因详解
在 CLion 中点击右键运行 main.cpp
文件 时:
它会临时生成一个只编译
main.cpp
的目标,没有链接你项目中定义的其他源文件(.cpp
),所以报链接错误。
而你点击的是:
❌ 右键 main.cpp → Run main.cpp
只运行单文件,不会编译整个项目。
✅ 正确做法
请始终使用:
✅ Run 'EmployeeSystem'
或 Run '<your_target_name>'
也就是你在 CMakeLists.txt
中通过 add_executable()
定义的那个目标,例如:
add_executable(EmployeeSystem
main.cpp
Looper.cpp
Message.cpp
PrintHandler.cpp
...
)
在 CLion 里:
- 点击右上角运行配置的下拉按钮,选择
EmployeeSystem
- 或者点绿色小锤子和绿色三角形按钮来
Build
/Run
项目
✅ 避免误操作建议
你可以设置默认只运行 CMake 目标:
- 打开
Run → Edit Configurations
- 确保你运行的是
CMake Application
类型(不是main.cpp
) - 删除
main.cpp
的运行配置(避免误点)
✅ 总结
操作 | 后果 |
---|---|
✅ 运行整个项目(CMake目标) | 正常链接所有模块 |
❌ 只运行 main.cpp | 缺少链接,报错 |
你项目现在已经没问题了,只是 CLion 使用方式上的误区。后续只运行项目名对应的目标就不会出错了 ✅