Windows10+MSVC环境下用Meson构建SDL2项目无法链接SDLmain.lib怎么办?
解决方法
你遇到的LNK2019报错是因为MSVC构建GUI程序时默认入口为WinMain,SDL的设计是由SDLmain.lib提供WinMain实现并调用你编写的标准main函数,静态链接SDL2时pkg-config不会自动引入SDLmain.lib,可以通过以下两种方案解决:
方案1:显式链接SDLmain.lib
修改meson.build配置,显式声明SDL2main的依赖:
project('mytest', 'c') cc = meson.get_compiler('c') deps = [] deps += dependency('sdl2', required: true, static: true, method: 'pkg-config') # 新增SDL2main依赖声明 deps += dependency('sdl2main', required: true, static: true, method: 'pkg-config') # 如果pkg-config无法找到sdl2main,替换上面的sdl2main声明为如下手动查找逻辑: # if cc.get_id() == 'msvc' # deps += cc.find_library('SDLmain', required: true) # endif executable('demo', 'src/main.c', dependencies : deps, gui_app: true)
该方案无需修改业务代码,保持标准int main(int argc, char* argv[])签名即可正常运行。
方案2:自定义入口(无需链接SDLmain.lib)
如果你不想引入SDLmain.lib,可以通过宏定义指定自行处理SDL入口逻辑:
- 在meson配置中添加
SDL_MAIN_HANDLED编译宏
project('mytest', 'c') cc = meson.get_compiler('c') # 新增宏定义 add_project_arguments('-DSDL_MAIN_HANDLED', language: 'c') deps = [] deps += dependency('sdl2', required: true, static: true, method: 'pkg-config') executable('demo', 'src/main.c', dependencies : deps, gui_app: true)
- 在业务代码的
main函数最开头(SDL_Init之前)调用SDL_SetMainReady():
int main(int argc, char* argv[]) { SDL_SetMainReady(); SDL_Init(SDL_INIT_VIDEO); // 后续业务逻辑 return 0; }
内容的提问来源于stack exchange,提问作者gberth
相关产品推荐
相关产品推荐

