You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CLion中Qt6项目编译报错LNK2019:WinMain引用未定义main

Qt6 + CLion 链接错误:LNK2019 未定义外部符号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的核心问题有两个:

  1. 缺少包含main函数的源文件:SOURCES集合中可能未包含实现main的cpp文件(如main.cpp),导致编译后无main函数符号。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:55:27