未指定 cgo SDL 函数

我试过在任何地方查找它并尝试了我能做的一切,但我无法让 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_Surface

var screen* C.SDL_Surface

C.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)?


牧羊人nacy
浏览 210回答 3
3回答

拉丁的传说

SDL_LoadBMP 是一个宏,而不是一个函数。它的定义是#define&nbsp;SDL_LoadBMP(file)&nbsp;&nbsp;&nbsp;SDL_LoadBMP_RW(SDL_RWFromFile(file,&nbsp;"rb"),&nbsp;1)但是,Cgo 将无法使用宏,因此您有两个选择:要么使用宏的扩展版本,要么编写一个使用宏的 C 函数并从 Go 调用该函数,这将是首选。

斯蒂芬大帝

在回退到 c 之前,您是否尝试在 go 中使用本机 SDL 库?此外,如果这不起作用,您可以只用 c 编写或使用其他类型的库,例如 OpenGL 或 Ogre3D 进行图形工作,这两者在不久前都支持 go。编辑:你确定 Go 是适合你正在做的游戏/图形工作类型的语言吗?诸如 java 或 c++ 之类的东西在行业中更为常见,并且具有更好的支持。Go 并不经常用于游戏,这是因为缺乏许多不同 API 的官方库。

慕桂英4014372

恐怕我将不得不同意普拉克什的观点,尽管他的措辞有点粗鲁。对于大型图形应用程序来说,Go 还不够成熟,我假设您使用 SDL 时,您要么已经是一个独立的游戏开发人员,希望以 Go 的形式尝试新事物,要么是现有的 Go 程序员选择了一个糟糕的语言来开发游戏(尝试 C++ 或 Haskell,学习多种语言没有坏处!;-))当然,您可能不熟悉编程和游戏开发,在这种情况下,我建议您尝试使用 Game Maker 或学习 C++ 教程。至于你的第二个问题,你可以使用 Go 的 'nil',因为据我所知,这仍然代表 '\0' 的 ASCII 字符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go