为了账号安全,请及时绑定邮箱和手机立即绑定

未指定 cgo SDL 函数

未指定 cgo SDL 函数

Go
牧羊人nacy 2021-06-18 14:02:04
我试过在任何地方查找它并尝试了我能做的一切,但我无法让 SDL 在 Go 中工作。这是我的代码,有点草率,但我只是想让它工作,只是为了测试它,只是作为一个起点。我打算稍后清理它并摆脱所有不必要的#defines。package main// #cgo LDFLAGS: -lSDL -lSDL_main -lSDL_image// #include <stdio.h>// #include <SDL/SDL.h>// #include <SDL/SDL_main.h>// #include <SDL/SDL_image.h>import "C"import "runtime"func init() {runtime.LockOSThread()}func main() {var image* C.SDL_Surfacevar screen* C.SDL_SurfaceC.SDL_Init( C.SDL_INIT_EVERYTHING )screen = C.SDL_SetVideoMode(640, 480, 32, C.SDL_SWSURFACE)hello = C.SDL_LoadBMP( "moe.bmp" )C.SDL_BlitSurface(hello, nil, screen, nil)C.SDL_Flip(screen)C.SDL_Delay(2000)C.SDL_FreeSurface(hello)C.SDL_Quit()}这给了我“命令行参数”错误:“SDL_LoadBMP”未声明(首次在此函数中使用),并且没有任何搜索或魔法可以修复它。如果需要,我在 Ubuntu 上使用 SDL 1.0.2(我认为)我宁愿不使用包装器,因为 Go 的唯一 SDL 1 包装器已有两年历史,而两个好的包装器用于 SDL 2,我宁愿使用 SDL 1。谢谢任何可以指导我的人。另外,额外的问题,因为编译器永远不会让我测试它(显然),我是否在 BlitSurface 的参数中使用“nil”、“NULL”或“C.NULL”(我知道我必须#define)?
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

SDL_LoadBMP 是一个宏,而不是一个函数。它的定义是

#define SDL_LoadBMP(file)   SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)

但是,Cgo 将无法使用宏,因此您有两个选择:要么使用宏的扩展版本,要么编写一个使用宏的 C 函数并从 Go 调用该函数,这将是首选。


查看完整回答
反对 回复 2021-06-28
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

在回退到 c 之前,您是否尝试在 go 中使用本机 SDL 库?此外,如果这不起作用,您可以只用 c 编写或使用其他类型的库,例如 OpenGL 或 Ogre3D 进行图形工作,这两者在不久前都支持 go。

编辑:你确定 Go 是适合你正在做的游戏/图形工作类型的语言吗?诸如 java 或 c++ 之类的东西在行业中更为常见,并且具有更好的支持。Go 并不经常用于游戏,这是因为缺乏许多不同 API 的官方库。


查看完整回答
反对 回复 2021-06-28
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

恐怕我将不得不同意普拉克什的观点,尽管他的措辞有点粗鲁。对于大型图形应用程序来说,Go 还不够成熟,我假设您使用 SDL 时,您要么已经是一个独立的游戏开发人员,希望以 Go 的形式尝试新事物,要么是现有的 Go 程序员选择了一个糟糕的语言来开发游戏(尝试 C++ 或 Haskell,学习多种语言没有坏处!;-))

当然,您可能不熟悉编程和游戏开发,在这种情况下,我建议您尝试使用 Game Maker 或学习 C++ 教程。

至于你的第二个问题,你可以使用 Go 的 'nil',因为据我所知,这仍然代表 '\0' 的 ASCII 字符。


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信