链接阶段报错主因是链接器未找到全局作用域的main函数定义,常见于文件未参与链接、Windows子系统设置为WINDOWS导致查找WinMain、main拼写错误、位于命名空间/类内、签名不符或声明未定义等情况。

这是链接阶段报错,说明编译器找到了所有源文件,但链接器没找到 main 函数定义——不是没写,而是没被链接进去,或者签名不对。
检查 main 函数是否存在且命名正确
Windows 下默认要求 main 或 wmain(Unicode),Linux/macOS 只认 main。常见漏写情况:
- 函数名拼错,比如写成
mani、Main(C++ 区分大小写) - 放在了类里或命名空间内,例如
namespace app { void main() {...} }—— 链接器只找全局作用域的main - 声明了但没定义,比如头文件里写了
int main();,但 .cpp 里没实现 - 用了
int main(int argc, char* argv[])以外的签名(如少参数、类型不匹配),某些标准库/工具链会拒绝识别
确认源文件是否参与了链接
即使写了 main,如果对应 .cpp 文件根本没加进编译命令或项目配置里,链接器照样找不到。
- 用命令行编译时,确保所有 .cpp 文件都列在
g++或cl命令末尾,例如:g++ main.cpp utils.cpp -o app;漏掉main.cpp就必然报这个错 - VS 中右键 .cpp 文件 → “属性” → “常规” → “项类型” 必须是 “C/C++ 编译器”,不能误设为 “不参与生成”
- CMake 项目中,检查
add_executable()的源文件列表是否包含含main的文件,而不是只写了add_library()
留意子系统和入口设置冲突
尤其在 Windows 上,/SUBSYSTEM:WINDOWS 会让链接器去找 WinMain,而非 main;而默认控制台程序用 /SUBSYSTEM:CONSOLE 才找 main。
立即学习“C++免费学习笔记(深入)”;
- VS 中:项目属性 → “链接器” → “系统” → “子系统” 应为 “控制台 (/SUBSYSTEM:CONSOLE)”
- 命令行 cl.exe:显式加
/SUBSYSTEM:CONSOLE,否则可能按 GUI 模式处理 - MinGW/GCC 默认走控制台,但若手动加了
-mwindows,也会跳过main查找 - 注意:VS 新建“Windows 桌面应用程序”模板默认用
WinMain,此时必须改入口或重写函数,不能硬留main
最常被忽略的是多文件工程里 main 所在文件未加入构建,或者 Windows 子系统设置与函数签名不匹配——这两处查完,90% 的情况就解决了。


















