代码遇到的问题
找不到符号
环境: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已经定义