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

使用SDL2与CMake从零开发DX11引擎时遭遇LNK2019未解析main符号错误的求助

使用SDL2与CMake从零开发DX11引擎时遭遇LNK2019未解析main符号错误的求助

看起来你遇到的这个LNK2019错误是SDL2在Windows平台下非常常见的链接问题,结合你的代码和CMake配置,我整理了几个可能的原因和对应的解决办法,你可以逐一排查:


1. 最可能的原因:SDL2库的链接配置缺失

你的CMakeLists.txt里只链接了DoctrinaEngine,但完全没有处理SDL2的依赖链接!在Windows平台下,SDL2需要链接两个关键库:

  • SDL2main:负责把你的main函数转换为SDL2要求的入口点(解决Windows下main/WinMain的入口点冲突)
  • SDL2:SDL2的核心功能库

你需要在CMake里正确引入并链接这两个库,修改后的CMakeLists.txt可以参考这个结构:

cmake_minimum_required (VERSION 3.12) # 你之前写的4.0.2是错误的,CMake当前最高版本为3.x系列
project ("DoctrinaEditor")

# 找到SDL2依赖
find_package(SDL2 REQUIRED)

# 收集源文件
file(GLOB SOURCE_FILES CONFIGURE_DEPENDS "Source/*.cpp")
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

# 链接SDL2和你的引擎库
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2main SDL2::SDL2 DoctrinaEngine)

# 预编译头设置
target_precompile_headers(${PROJECT_NAME} PRIVATE "Source/stdafx.h")

# C++20支持
if (CMAKE_VERSION VERSION_GREATER 3.12)
    set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 20)
endif()

# 如果是窗口程序(不需要控制台),添加这个设置
set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE ON)

如果你的SDL2是手动下载的,可能需要在CMake里指定SDL2的安装路径,比如:

set(SDL2_DIR "你的SDL2安装路径/lib/cmake/SDL2")

或者用vcpkg之类的包管理器来管理SDL2依赖,这样CMake能自动找到库文件。


2. 检查源文件是否被正确包含

你用了file(GLOB SOURCE_FILES CONFIGURE_DEPENDS "Source/*.cpp")来收集源文件,要确保main.cpp确实在Source/目录下,并且CMake能正确找到它。可以在CMake里加一句调试输出,确认源文件列表:

message(STATUS "找到的源文件:${SOURCE_FILES}")

编译时看控制台输出,如果main.cpp不在列表里,说明路径配置错了,需要调整file(GLOB)的路径参数。


3. 修复main.cpp里的语法错误(虽非链接错误直接原因,但会导致逻辑异常)

你的main.cpp里有个明显的switch嵌套语法错误,这个错误可能导致编译警告甚至逻辑混乱,建议先修复:
原代码里在SDL_QUIT的case后直接嵌套了一个switch,而且没有正确的case判断,正确的写法应该是把窗口事件的判断放在SDL_WINDOWEVENT的case下:

while(SDL_PollEvent(&event)) {
    switch (event.type) {
        case SDL_QUIT:
            quit = true;
            break;
        case SDL_WINDOWEVENT: // 先判断是窗口事件类型
            switch (event.window.event) {
                case SDL_WINDOWEVENT_CLOSE:
                    quit = true;
                    break;
                case SDL_WINDOWEVENT_RESIZED:
                    // 这里可以添加窗口 resize 后的处理逻辑
                    break;
            }
            break;
        default:
            break;
    }
}

4. 检查CMake版本配置

你之前写的cmake_minimum_required (VERSION 4.0.2)明显是错误的,CMake目前最高版本是3.x系列,这个错误会导致CMake无法正确初始化,进而影响后续的所有配置,建议改成3.12或更高(因为你用到了C++20的设置,3.12及以上支持CXX_STANDARD属性)。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:53:04