Mil*_*anV 9 openal directsound go
我已经杀了一个星期试图在我的一个项目中解决一个神秘的问题,我没有想法.
我写了一个Go包,打算播放包含OpenAL的声音......非常基本的东西.我让它在我的Xubuntu 14.04(32位)上工作,所以我启动到Windows(7,也是32位)以便移植它......这就是问题开始的地方.
每当我尝试使用我的音频包时,该程序就会崩溃,并使用c0000005.我试图通过gdb运行它,并惊讶地发现它没有问题,它甚至播放我的测试声音.
时间过去了,不知道该怎么做,我下载了OpenAL Soft源代码并开始添加printfs - 并发现它崩溃的确切行:
http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/backends/dsound.c#l361
对于那些懒得点击链接(或链接停止工作),这是对DirectSoundCreate的调用.再次运行调试器,我在调用之前和之后看到了我的打印,并且在它们之间创建了4个新线程.
这些是Go文件中的相关内容:
package audio
/*
#cgo CFLAGS: -I"../libraries/include"
#cgo windows,386 LDFLAGS: ../libraries/lib/windows/x86/OpenAL32.dll
#cgo windows,amd64 LDFLAGS: ../libraries/lib/windows/x64/OpenAL32.dll
#cgo linux LDFLAGS: -lopenal
#include "audio.h"
*/
import "C"
import (
"errors"
)
var context *C.ALCcontext
func Init() error {
context = C.initAudio() // it crashes on this line
if context == nil {
return errors.New("could not initialize audio")
}
SetActiveListener(NewListener())
return nil
}
Run Code Online (Sandbox Code Playgroud)
这是实际进行OpenAL调用的C文件:
#include "audio.h"
#include <string.h>
#include <stdio.h>
ALCcontext* initAudio() {
ALCdevice* device = alcOpenDevice(NULL); // crashes here
if (device == NULL) {
return NULL;
}
ALCcontext* context = alcCreateContext(device, NULL);
if (!alcMakeContextCurrent(context)) {
return NULL;
}
return context;
}
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的是,如果我在纯C中做同样的事情(字面意思只是将main添加到我发布和调用的文件中initAudio
),它就可以了.
我的问题很明显:#@!$正在发生什么?
编辑:
其他一些可能值得一提的事情:
我创建了一个完全独立于前一个项目的新项目,其中我有前面发布的两个文件(显然是Go文件中链接器的路径不同)和一个只执行一项操作的主Go文件:call audio.Init
.无论我尝试哪个dll(我尝试了http://openal.org中的"官方" 版本,OpenAL Soft的预编译版本和我自己编译的两个版本,一个使用MinGW,另一个使用Visual Studio),它的行为相同.我也试着runtime.LockOSThread
在开始时打电话audio.Init
,但没有帮助.
此外,我将编译后的程序发送给了我的两个朋友,一个运行Windows 8,另一个运行Windows 7(均为64位).Windows 8的用户表示它有效,有7人说它崩溃了.但是,如果我们尝试使用64位工具链从后一台机器上的源代码编译它,它就可以工作了.
编辑#2:
我只是尝试从源代码再次编译OpenAL Soft - 首先使用Visual Studio然后使用MinGW - 然后将我之前提到的独立项目与库文件(来自VS的OpenAL32.lib和来自MinGW的libOpenAL32.dll.a)链接,而不是直接的DLL(因为那是......我猜的更正确的方法?)
VS的结果:
它在链接期间失败,并显示以下消息:
# command-line-arguments
C:\Users\Milan\AppData\Local\Temp\go-build078751523/audiot/audio.a(_all.o): malf
ormed pe file: unexpected flags 0xe0500020 for PE section .text
audiot/audio._Cfunc_initAudio: undefined: _cgo_e0a3be4f138e_Cfunc_initAudio
Run Code Online (Sandbox Code Playgroud)
MinGW的结果:
它成功地编译和运行,虽然它没有阻止崩溃,但至少它打印出来的东西:
fatal error: unexpected signal during runtime execution
[signal 0xc0000005 code=0x1 addr=0x420f85 pc=0x42874c]
runtime stack:
invalid spdelta 96655 -1
runtime: unexpected return pc for _cgo_ec587e40eeca_Cfunc_initAudio called from
0x42874800
runtime.throw(0x455dc0)
c:/go/src/pkg/runtime/panic.c:520 +0x71
runtime.sigpanic()
c:/go/src/pkg/runtime/os_windows.c:352 +0x46
invalid spdelta 96655 -1
runtime: unexpected return pc for _cgo_ec587e40eeca_Cfunc_initAudio called from
0x42874800
_cgo_ec587e40eeca_Cfunc_initAudio()
?:0 +0xc
goroutine 16 [syscall]:
runtime.cgocall(0x428740, 0x533f64)
c:/go/src/pkg/runtime/cgocall.c:143 +0xed fp=0x533f58 sp=0x533f2c
audiot/audio._Cfunc_initAudio(0x42e340)
audiot/audio/_obj/_cgo_defun.c:53 +0x37 fp=0x533f64 sp=0x533f58
audiot/audio.Init(0x0, 0x0)
C:/Users/Milan/Desktop/Dropbox/Projekty/Go/src/audiot/audio/at.go:23 +0x
3c fp=0x533f90 sp=0x533f64
main.main()
c:/Users/Milan/Desktop/Dropbox/Projekty/Go/src/audiot/main.go:10 +0x29 f
p=0x533f9c sp=0x533f90
runtime.main()
c:/go/src/pkg/runtime/proc.c:247 +0x11e fp=0x533fd0 sp=0x533f9c
runtime.goexit()
c:/go/src/pkg/runtime/proc.c:1445 fp=0x533fd4 sp=0x533fd0
created by _rt0_go
c:/go/src/pkg/runtime/asm_386.s:101 +0x102
goroutine 17 [syscall]:
runtime.goexit()
c:/go/src/pkg/runtime/proc.c:1445
exit status 2
Run Code Online (Sandbox Code Playgroud)
我还认为发布我的工具链的特点是不会有害的:
$ gcc --version
gcc.exe (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
$ go version
go version go1.3 windows/386
Run Code Online (Sandbox Code Playgroud)
让我们不要忘记Visual Studio 2013 Express
归档时间: |
|
查看次数: |
937 次 |
最近记录: |