使用CLion/CMake/MSVC 2015编译WIN32应用时出现链接错误
搞定CLion + VS2015工具链编译WIN32应用的链接错误
我帮你梳理下这个问题的排查思路和解决方案,毕竟我也碰到过类似的坑😉
先明确你的问题场景
你用CLion(不管是2018.1 EAP还是旧版正式版)搭配VS2015工具链,架构设为x86_amd64,编译简单WIN32应用时触发链接错误,而且能稳定复现。
先把你提到的最简可复现代码整理好
CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(Win32TestApp) # 这里很关键,别漏了WIN32标识 add_executable(Win32TestApp WIN32 main.cpp)
main.cpp
#include <windows.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int showCmd) { MessageBox(NULL, TEXT("Hi there!"), TEXT("WIN32 Demo"), MB_OK); return 0; }
最可能的几个问题和解决办法
1. CMake没标记WIN32应用类型
这是最常见的坑!如果你的add_executable里没加WIN32,CMake会默认按控制台程序编译,链接器会去找main()函数,但你写的是WinMain(),直接就会报unresolved external symbol _main这类错误。
修复方法:就在add_executable里加上WIN32,像上面代码那样就行。
2. 工具链架构配置冲突
你选的x86_amd64是用32位工具链交叉编译64位程序,VS2015的这个交叉环境有时候会因为环境变量没正确初始化,导致链接器找不到对应架构的系统库。
修复方法:
- 直接换工具链架构为
amd64(原生64位工具链),去CLion的File > Settings > Build, Execution, Deployment > Toolchains里改,改完重启下CLion。 - 要是非得用
x86_amd64,先手动打开命令行,运行"%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86_amd64初始化交叉编译环境,再启动CLion。
3. Debug模式下CRT库链接不对
Debug模式经常会因为CRT库的版本不匹配触发链接错误,VS2015的Debug CRT和Release CRT是分开的。
修复方法:在CMakeLists.txt里加一段针对MSVC的配置:
if(MSVC) # Debug用多线程Debug CRT set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") # Release用多线程CRT set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") endif()
4. VS2015工具链组件不全
可能你装VS2015的时候没选全C相关组件,比如缺了Windows SDK或者VC运行库,导致链接器找不到必要的系统库文件。
修复方法:打开VS2015的安装管理工具,检查是否安装了"Visual C++ 2015 Runtime Libraries"和对应版本的Windows SDK,补装后重启CLion。
最后验证步骤
- 把代码和CMakeLists.txt按上面的改好。
- 清一下CLion的缓存:
File > Invalidate Caches...,选"Invalidate and Restart"。 - 重新构建项目,应该就能正常编译运行了。
内容的提问来源于stack exchange,提问作者Guillaume Lavoie
相关产品推荐
相关产品推荐

