随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

S2005下SDL的编译链接问题

当下载SDL for win32 搭建好编译环境后,建立个win32 控制台 编译SDL 中Demo-- loopave.c程序,有如下link erro:

1>Compiling...
1>loopwave.c
1>Linking...
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>../bin/sdlSample1.exe : fatal error LNK1120: 1 unresolved externals

win32控制台程序的入口函数为main _main 或_tmain.  subsystem 已经选择为为win32 console了,所以应该不会出现

启动函数中 _main链接失败的状况。

究其原因是因为SDL有自己的入口函数SDL_main,,,也查看过loopwave.obj发现里面确实没有main _main 而是有SDL_main

_SDL_main,这说明,demo 中的main函数名已被改动了,具体在哪里被改的,应该是在你包含#include "SDL_config.h"中。

查实了下:

在SDL_main.h有下列说明

#define main SDL_main  --->我们的main函数名就这边被改变了。

/* The prototype for the application's main() function */
extern C_LINKAGE int SDL_main(int argc, char *argv[]);

由于没有导出main _main在进行链接 当然出现 unresolved external symbol _main.

解决措施1:

很简单,告诉链接器,我们程序的入口函数名 已经改变了,在项目属性里,Linker-->Advanced-->Entry Point 填写SDL_main。这样

___tmainCRTStartup 就会调用入口函数SDL_main

解决措施2:

既然SDL在编译时会改变main函数的名称为SDL_main,,我们可以自己改变main函数名称为其它的名称,如main_t等,然后在项目属性里,Linker-->Advanced-->Entry Point 填写main_t等,这样

___tmainCRTStartup 就会调用入口函数main_t,使用SDL也不会有问题的。

此外当使用gcc编译器,编译SDL程序,也要注意这一点,,我们也需要告诉链接器,入口函数不是main 而是 SDL_main。

链接时只需要加个 _Dmain = SDL_main 即可.

下面是别人的解释,感觉有点问题。

"Compiling program, which uses SDL must be done this way:
g++ -o helloworld -Dmain=SDL_main helloworld.cpp -lmingw32 -lSDLmain -lSDL

That is because SDL uses its own main function, 
which sets up some stuff for it,

and users main function must be named SDL_main

(which this -D... directive does - renames it automatically)."

posted on   紫金树下  阅读(368)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2012年2月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 1 2 3
4 5 6 7 8 9 10

点击右上角即可分享
微信分享提示