CLion中Qt6项目编译报错LNK2019:WinMain引用未定义main
问题现象
在CLion中创建Qt6项目,运行时触发链接错误,提示WinMain中引用的外部符号main未定义,对应LNK2019和LNK1120错误。
编译报错日志
[1/1] Linking CXX executable untitled.exe
FAILED: untitled.exe
cmd.exe /C "cd . && "C:\Program Files\JetBrains\CLion 2022.2.4\bin\cmake\win\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\untitled.dir --rc=C:\PROGRA2\WI3CF21\10\bin\100220~1.0\x64\rc.exe --mt=C:\PROGRA2\WI3CF21\10\bin\100220~1.0\x64\mt.exe --manifests -- C:\PROGRA1\MIB0551\2022\COMMUN1\VC\Tools\MSVC\14341.319\bin\Hostx64\x64\link.exe /nologo CMakeFiles\untitled.dir\untitled_autogen\mocs_compilation.cpp.obj /out:untitled.exe /implib:untitled.lib /pdb:untitled.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:windows -DYNAMICBASE -NXCOMPAT -LARGEADDRESSAWARE C:\Qt\6.4.1\msvc2019_64\lib\Qt6Widgetsd.lib C:\Qt\6.4.1\msvc2019_64\lib\Qt6Guid.lib C:\Qt\6.4.1\msvc2019_64\lib\Qt6Cored.lib mpr.lib userenv.lib C:\Qt\6.4.1\msvc2019_64\lib\Qt6EntryPointd.lib shell32.lib d3d11.lib dxgi.lib dxguid.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA1\MIB0551\2022\COMMUN1\VC\Tools\MSVC\14341.319\bin\Hostx64\x64\link.exe /nologo CMakeFiles\untitled.dir\untitled_autogen\mocs_compilation.cpp.obj /out:untitled.exe /implib:untitled.lib /pdb:untitled.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:windows -DYNAMICBASE -NXCOMPAT -LARGEADDRESSAWARE C:\Qt\6.4.1\msvc2019_64\lib\Qt6Widgetsd.lib C:\Qt\6.4.1\msvc2019_64\lib\Qt6Guid.lib C:\Qt\6.4.1\msvc2019_64\lib\Qt6Cored.lib mpr.lib userenv.lib C:\Qt\6.4.1\msvc2019_64\lib\Qt6EntryPointd.lib shell32.lib d3d11.lib dxgi.lib dxguid.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\untitled.dir/intermediate.manifest CMakeFiles\untitled.dir/manifest.res" failed (exit code 1120) with the following output:
Qt6EntryPointd.lib(qtentrypoint_win.cpp.obj) : error LNK2019: unresolved external symbol main referenced in function WinMain
untitled.exe : fatal error LNK1120: 1 unresolved externals
ninja: build stopped: subcommand failed.
项目CMakeLists.txt配置
cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) if (WIN32) project(untitled LANGUAGES CXX) elseif(UNIX) project(untitled) endif() set(CMAKE_CONFIGURATION_TYPES "Release;RelWithDebInfo" CACHE STRING "" FORCE) #======================= INCLUSION OF Qt =======================# set(CMAKE_PREFIX_PATH "C:/dev/vcpkg/ports") find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui ) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) #=================== INCLUSION OF Project Files ====================# set(FORMS_DIR "${CMAKE_SOURCE_DIR}/forms") set(INCLUDE_DIR "${CMAKE_SOURCE_DIR}/include") set(SOURCE_DIR "${CMAKE_SOURCE_DIR}/src") include_directories(${FORMS_DIR}) include_directories(${INCLUDE_DIR}) include_directories(${SOURCE_DIR}) file(GLOB_RECURSE SOURCES "${FORMS_DIR}/*.ui" "${FORMS_DIR}/*.qrc" "${INCLUDE_DIR}/*.h" "${SOURCE_DIR}/*.cpp" ) #=================== SETUP EXECTUABLE ====================# # Enable debug logging on RELWITHDEBINFO configuration set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:RELWITHDEBINFO>:QT_MESSAGELOGCONTEXT> ) # Add the forms directory to the AUTOUIC search paths set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_AUTOUIC_SEARCH_PATHS} ${FORMS_DIR}) # Add the executable if (WIN32) qt_add_executable(untitled WIN32 ${SOURCES}) elseif(UNIX) qt_add_executable(untitled ${SOURCES}) endif() # Add the target includes for MY_PROJECT target_include_directories(untitled PRIVATE ${FORMS_DIR}) target_include_directories(untitled PRIVATE ${INCLUDE_DIR}) target_include_directories(untitled PRIVATE ${SOURCE_DIR}) #===================== LINKING LIBRARIES =======================# target_link_libraries(untitled PRIVATE Qt6::Widgets Qt6::Core Qt6::Gui)
问题原因及解决方法
原因分析
错误中的WinMain来自Qt的Qt6EntryPointd.lib(Debug版本),这个库负责封装Windows平台的入口函数,它会调用标准的main函数。找不到main的核心问题有两个:
- 缺少包含main函数的源文件:
SOURCES集合中可能未包含实现main的cpp文件(如main.cpp),导致编译后无main函数符号。 - CMAKE_PREFIX_PATH配置错误:当前指向vcpkg的ports目录,而非Qt的实际安装路径,可能导致
find_package未正确加载Qt的全部配置(包括入口函数相关定义)。
修复步骤
检查并添加main函数文件
确保项目src目录下存在main.cpp,示例内容:#include <QApplication> #include "主窗口头文件.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); 主窗口类 window; window.show(); return app.exec(); }若文件已存在,确认
file(GLOB_RECURSE SOURCES)能正确匹配到该文件(路径、后缀需符合规则)。修正CMAKE_PREFIX_PATH
将其改为Qt的实际安装路径,比如你使用的C:\Qt\6.4.1\msvc2019_64:set(CMAKE_PREFIX_PATH "C:/Qt/6.4.1/msvc2019_64")也可直接删除该行,确保系统环境变量已添加Qt路径,让CMake自动检索。
可选:调整WIN32参数
若不需要纯GUI程序(需保留控制台输出),可移除qt_add_executable中的WIN32参数,此时链接器会直接查找main而非WinMain;但Qt GUI程序通常需保留该参数。清理缓存重新构建
在CLion中点击File -> Reload CMake Project,或手动删除CMakeCache.txt与build目录后重新构建。
内容的提问来源于stack exchange,提问作者krrish setia

