代码正确,但是一直提示错误

undefined reference to `PrintHandler::PrintHandler(Looper*)'
collect2.exe: error: ld returned 1 exit status

无意中发现自己运行的是 main.cpp 而不是整个项目,运行整个项目就会正常了。

具体原因见 AI

这是一个 CLion 或 CMake 配置相关的问题,不是代码逻辑问题,而是你在运行 main.cpp 文件单独作为“单文件运行”时,编译器没有正确链接整个项目的所有 .cpp 文件(例如 Looper.cppPrintHandler.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 使用方式上的误区。后续只运行项目名对应的目标就不会出错了 ✅