SDL2链接报错:无法解析的外部符号 SDL_main,函数 main_getcmdline 中引用了该符号/main 已经在 main.obj 中定义

文章讲述了开发者在VS2022环境中使用SDL2.30.2遇到的无法解析SDL_main符号的问题,解决方法包括定义SDL_Main_HANDLED宏、调整main函数签名以及更改项目属性中的链接器设置。
摘要由CSDN通过智能技术生成

代码遇到的问题

找不到符号

环境:VS2022 SDL2.30.2 

无法解析的外部符号 SDL_main,函数 main_getcmdline 中引用了该符号    

但是依赖库lib都有正确配置加载

解决方法是定义SDL_MAIN_HANDLED宏, 

根据官方文档SDL_SetMainReady:

This function is defined in SDL_main.h, along with the preprocessor rule to redefine main() as SDL_main(). Thus to ensure that your main() function will not be changed it is necessary to define SDL_MAIN_HANDLED before including SDL.h.

SDL默认会自己将main重定义为SDL_main

但是按照这个逻辑,怎么还会找不到SDL_main符号呢?问题出在函数签名上:

我的main函数长这样:

int main(int argc, const char* argv[]);
// 未定义SDL_MAIN_HANDLED时,实际内联展开成下面这样
int SDL_main(int argc, const char* argv[]);

查看SDL_main.h下的定义:

// SDL_main.h
// SDL想要的函数长这样
extern SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[]);
// 第二个参数没有const

所以链接不上。咋办呢?

把自己的main函数改成一样的就行了

int main(int argc, char* argv[]);
//int main(int argc, char** const argv); //这样其实也行

依然出现错误

又去配了一个SDL项目,发现这个问题又出现了,尝试了各种方法都没用。最后把目光转向了第一个报错:

错误    LNK2005    main 已经在 main.obj 中定义      

最后在项目属性设置中把链接器->子系统改为窗口,问题就解决了。不知道原理是什么

顺便测试了一下,SDL_MAIN_HANDLED;宏还是有必要的,没有定义的话,依然会报

无法解析的外部符号 SDL_main,函数 main_getcmdline 中引用了该符号

而子系统设置不对就会像上面一样多出来一个main已经定义

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值