投稿日: Jun 05, 2019 1:10:58 PM
うごかない2019
あれからいろいろ学んだ、再びなんとなくGolangに戻ってきた。
PyGameやらKivyやらでSDLづいてるのでここらで再びgo-sdl2でもいじってみるかーってことです。
とりあえずインストールしてコードをためす。
しかしなにやらエラー。
go get -v github.com/veandco/go-sdl2/{sdl,mix,img,ttf}
とりあえず導入ね、この時点でエラーがでる。
/home/pi/go/src/github.com/veandco/go-sdl2/sdl/cpuinfo.go:48:24: error: static declaration of 'SDL_HasNEON' follows non-static declaration
static inline SDL_bool SDL_HasNEON()
^~~~~~~~~~~
In file included from /usr/include/SDL2/SDL.h:38:0,
from ./sdl_wrapper.h:5,
from /home/pi/go/src/github.com/veandco/go-sdl2/sdl/cpuinfo.go:4:
/usr/include/SDL2/SDL_cpuinfo.h:155:34: note: previous declaration of 'SDL_HasNEON' was here
extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void);
^~~~~~~~~~~
こいつはなんなのか。
Added SDL_HasNEON() which returns whether the CPU has NEON instruction support
ってことであんまり関係無さそうなものです。(コプロなので関係なくはないんだけど)
で、SDL_cpuinfo.hにこの定義があるのが原因のエラー。
正確に言うと定義しかないからエラー。本体はコメントアウトされてる。
sudo vi /usr/include/SDL2/SDL_cpuinfo.h
155行目。
extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void);
こいつをコメントアウトする。
もう一度Goインストールのおさらい。
前後しちゃうけどGoの導入。
概ね過去の情報どおりで大丈夫なんですが落ち葉拾いも。
wget https://storage.googleapis.com/golang/go1.8beta2.linux-armv6l.tar.gz
tar xzf go1.8beta2.linux-armv6l.tar.gz
rm go1.8beta2.linux-armv6l.tar.gz
sudo mv go /usr/local/go
sudo ln -s /usr/local/go/bin/go /usr/bin/go
sudo ln -s /usr/local/go/bin/godoc /usr/bin/godoc
sudo ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt
こんな風に圧縮ファイルを展開して中身を移動したりシンボリックリンク貼ったりって感じでした。
sudo mv go /usr/local/go
で、ここ。これいけない。
あと、最新バージョンが1.12.5とかでもうこの情報通りにやるとかなーり古いバージョンを使うことになるのでそこら辺も踏まえ。
ダウンロードするバージョン。
何事もないなら最新版をつかいます。
で、https://golang.org/dl/ ここから アーキテクチャ ARMv6 のものを選んでダウンロードのアドレスをコピー。
Raspberry Piでの話ですからね、そういうことです。
バージョンが変わったときに面倒なのでひと工夫します。
適当にディレクトリを掘り、そこでダウンロード展開します。
mkdir /home/pi/golang
cd /home/pi/golang
wget https://dl.google.com/go/go1.12.5.linux-armv6l.tar.gz
tar xzf go1.12.5.linux-armv6l.tar.gz
rm go1.12.5.linux-armv6l.tar.gz
ここまではだいたい一緒。
次がちょっとちがう。
mv go go1.12.5
sudo ln -s /home/pi/golang/go1.12.5 /usr/local/go
要するにバージョンが変わるたびに中身入れ替えるのが面倒なのでシンボリックリンクだけ張り替えましょうという作戦です。
あとは、各種ツールが実行できるようにシンボリックリンクを作ります。
sudo ln -s /usr/local/go/bin/go /usr/bin/go
sudo ln -s /usr/local/go/bin/godoc /usr/bin/godoc
sudo ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt
ここまで出来ればインストールは完了。
go versionとか打ってgo version go1.12.5 linux/armのように表示されればオッケー。
おためし。
これも過去のものと一緒だけど一箇所だけちがう。
funcで引数が無いときにカッコを省略できてた? それともただのタイプミスなのか、過去のコードだと動かなかったので
func run int が func run() int になってます。それだけ。ちょっと悩んだ。
test.go
package main
import (
"os"
"github.com/veandco/go-sdl2/sdl"
)
func run() int {
var window *sdl.Window
var event sdl.Event
var running bool
var err error
sdl.Init(sdl.INIT_EVERYTHING)
defer sdl.Quit()
window, err = sdl.CreateWindow(
"test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, 600, 400,sdl.WINDOW_SHOWN)
if err != nil {
panic(err)
}
defer window.Destroy()
surface, err := window.GetSurface()
if err != nil {
panic(err)
}
rect := sdl.Rect{100,100,400,200}
surface.FillRect(&rect,0xffff0000)
window.UpdateSurface()
running = true
for running {
for event = sdl.PollEvent(); event != nil; event = sdl.PollEvent(){
switch event.(type) {
case *sdl.QuitEvent:
running = false
}
}
}
return 0
}
func main(){
os.Exit(run())
}
実行方法はとりあえず go run test.go とか。