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

使用VS2022 BuildTools编译SDL2项目遇LNK1561错误求助

解决SDL2编译时LNK1561入口点未定义问题

问题场景

尝试编译一段SDL2代码时,反复出现LINK : fatal error LNK1561: entry point must be defined错误,使用Visual Studio 2022 BuildTools版本,已尝试调整编译命令中库的顺序,但均无效。需要确认仅用BuildTools能否编译SDL2程序,以及需添加哪些命令行参数。

待编译的SDL2代码

//main.cpp

#include<SDL.h>

int main(int argc,char* argv[])
{
    if(SDL_Init(SDL_INIT_VIDEO))
    {
        return 1;
    }
        SDL_Window* window=SDL_CreateWindow("Project Igloo",(1366-640)/2,(768-480)/2,640,480,SDL_WINDOW_SHOWN);
        if(!window)
        {
            SDL_Log("Error : failed to create window: %s\n",SDL_GetError());
        }
        else
        {
            SDL_Renderer* renderer=SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTVSYNC);
            if(!renderer)
            {
                SDL_Log("Error - failed to create renderer: %s\n",SDL_GetError());
            }
            else
            {
                SDL_Rect fillrect={(640-200)/2,(480-200)/2,200,200};
                SDL_SetRenderDrawColor(renderer,0xff,0xff,0xff,0xff);
                SDL_RenderClear(renderer);
                SDL_SetRenderDrawColor(renderer,0x80,0x80,0x80,0xff);
                SDL_RenderFillRect(renderer,&fillrect);
                SDL_RenderPresent(renderer);

                SDL_Event event;
                bool running=true;
                while(running)
                {
                    while(SDL_PollEvent(&event))
                    {
                        if(event.type==SDL_QUIT)
                        running=false;
                    }

                }

                SDL_DestroyRenderer(renderer);
            }

            SDL_DestroyWindow(window);
        }
        SDL_Quit();
    return 0;
}

已尝试的编译命令

  • cl /EHsc /Iinclude main.cpp SDL2main.lib SDL2.lib /link /out:main.exe
  • cl /EHsc /Iinclude main.cpp SDL2.lib SDL2main.lib /link /out:main.exe
  • cl /EHsc /Iinclude SDL2main.lib SDL2.lib main.cpp /link /out:main.exe
  • cl /EHsc /Iinclude SDL2.lib SDL2main.lib main.cpp /link /out:main.exe

解决方案

仅用Visual Studio BuildTools完全可以编译SDL2程序,问题核心在于缺少子系统参数且库的依赖顺序需规范,正确编译需注意两点:

  1. 明确指定子系统类型:SDL2main.lib会替换默认程序入口点,必须通过参数指定子系统。若需保留控制台窗口,用/SUBSYSTEM:CONSOLE;若要纯窗口程序(无控制台),用/SUBSYSTEM:WINDOWS。
  2. 库的顺序不能颠倒:SDL2main.lib必须放在SDL2.lib之前,同时如果库文件不在系统默认路径,需用/LIBPATH:参数指定SDL库的所在目录。

正确编译命令示例

假设SDL头文件在include目录,库文件在lib目录:

  • 编译为带控制台的程序:
cl /EHsc /Iinclude main.cpp /link /LIBPATH:lib SDL2main.lib SDL2.lib /SUBSYSTEM:CONSOLE /out:main.exe
  • 编译为纯窗口程序:
cl /EHsc /Iinclude main.cpp /link /LIBPATH:lib SDL2main.lib SDL2.lib /SUBSYSTEM:WINDOWS /out:main.exe

补充说明

需确保BuildTools命令行环境与SDL库的架构匹配:若使用x64版本SDL库,需打开x64 Native Tools Command Prompt for VS 2022;32位库则对应x86环境,否则会出现架构不匹配的额外错误。

内容的提问来源于stack exchange,提问作者snowman4933

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:13:24