使用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

